Move alphabet type into SeqString
[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 #include <ostream>
12
13 //! this is a helper class for sequence
14 enum AlphabetRef { reduced_dna_alphabet, reduced_rna_alphabet, reduced_nucleic_alphabet, 
15                    nucleic_alphabet, protein_alphabet, empty_alphabet=255 };
16                    
17 class Alphabet {
18 friend class Sequence;
19 public:
20   typedef std::string::const_iterator const_iterator;
21   //! define the various alphabet types (as python corebio)
22   
23   friend bool operator==(const Alphabet&, const Alphabet&);
24   friend std::ostream& operator<<(std::ostream&, const Alphabet&);
25      
26   //! case-insensitive test to check a character for existence in our alphabet
27   bool exists(const char) const;
28   
29   //! return an alphabet given an AlphabetRef enumeration
30   static const Alphabet &get_alphabet(AlphabetRef);
31   // note, if you want to define an alphabet for a sequence, you probably want 
32   // to update the enumeration in Sequence, and Sequence::get_sequence
33   //! The standard DNA alphabet, with unique, and unknown characters
34   static const char *reduced_dna_cstr;
35   static const Alphabet &reduced_dna_alphabet();
36   //! The standard RNA alphabet, with unique, and unknown characters
37   static const char *reduced_rna_cstr;
38   static const Alphabet &reduced_rna_alphabet();
39   //! The standard DNA/RNA alphabet, with unique, and unknown characters
40   static const char *reduced_nucleic_cstr;
41   static const Alphabet &reduced_nucleic_alphabet();
42   //! this is the general IUPAC alphabet for nucleotides
43   static const char *nucleic_cstr;
44   static const Alphabet &nucleic_alphabet();
45   //! the protein alphabet
46   static const char *protein_cstr;  
47   static const Alphabet &protein_alphabet(); 
48   
49   static const char *empty_cstr;
50   static const Alphabet &empty_alphabet();
51     
52 private:
53   //! what are allowable symbols in our alphabet
54   std::string alphabet;
55   //! internal variable to make exists() faster
56   std::set<std::string::value_type> alphabet_set;
57   
58   //! some necessary string api access
59   Alphabet(const char *a);
60   //! allow sequence to copy one alphabet to another (needed when unserializing) 
61   void assign(const Alphabet& a);
62   const_iterator begin() const { return alphabet.begin(); }
63   const_iterator end() const { return alphabet.end(); }
64   
65   // serialization
66   friend class boost::serialization::access;
67   template<class Archive>
68   void serialize(Archive& ar, const unsigned int /*version*/) {
69     ar & BOOST_SERIALIZATION_NVP(alphabet);
70     alphabet_set.clear();
71     alphabet_set.insert(alphabet.begin(), alphabet.end());
72   }   
73 };
74
75 #endif /*ALPHABET_*/