399125478b57d514d4475bfff65685de8877fa68
[mussa.git] / alg / alphabet.hpp
1 #ifndef ALPHABET_HPP_
2 #define ALPHABET_HPP_
3
4 #include <boost/serialization/export.hpp>
5 #include <boost/serialization/nvp.hpp>
6 #include <boost/serialization/string.hpp>
7 #include <boost/serialization/utility.hpp>
8 #include <boost/serialization/version.hpp>
9
10 #include <set>
11
12 //! this is a helper class for sequence
13 class Alphabet {
14 friend class Sequence;
15 public:
16   typedef std::string::const_iterator const_iterator;
17
18   //! case-insensitive test to check a character for existence in our alphabet
19   bool exists(const char) const;
20   
21   // note, if you want to define an alphabet for a sequence, you probably want 
22   // to update the enumeration in Sequence, and Sequence::get_sequence
23   //! The standard DNA alphabet, with unique, and unknown characters
24   static const char *reduced_dna_cstr;
25   static const Alphabet &reduced_dna_alphabet();
26   //! The standard RNA alphabet, with unique, and unknown characters
27   static const char *reduced_rna_cstr;
28   static const Alphabet &reduced_rna_alphabet();
29   //! The standard DNA/RNA alphabet, with unique, and unknown characters
30   static const char *reduced_nucleic_cstr;
31   static const Alphabet &reduced_nucleic_alphabet();
32   //! this is the general IUPAC alphabet for nucleotides
33   static const char *nucleic_cstr;
34   static const Alphabet &nucleic_alphabet();
35   //! the protein alphabet
36   static const char *protein_cstr;  
37   static const Alphabet &protein_alphabet(); 
38     
39 private:
40   //! what are allowable symbols in our alphabet
41   std::string alphabet;
42   //! internal variable to make exists() faster
43   std::set<std::string::value_type> alphabet_set;
44   
45   //! some necessary string api access
46   Alphabet(const char *a);
47   //! allow sequence to copy one alphabet to another (needed when unserializing) 
48   void assign(const Alphabet& a);
49   const_iterator begin() const { return alphabet.begin(); }
50   const_iterator end() const { return alphabet.end(); }
51   
52   // serialization
53   friend class boost::serialization::access;
54   template<class Archive>
55   void serialize(Archive& ar, const unsigned int /*version*/) {
56     ar & BOOST_SERIALIZATION_NVP(alphabet);
57     alphabet_set.clear();
58     alphabet_set.insert(alphabet.begin(), alphabet.end());
59   }   
60 };
61
62 #endif /*ALPHABET_*/