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>
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 };
18 friend class Sequence;
20 typedef std::string::const_iterator const_iterator;
21 //! define the various alphabet types (as python corebio)
23 friend bool operator==(const Alphabet&, const Alphabet&);
24 friend std::ostream& operator<<(std::ostream&, const Alphabet&);
26 //! case-insensitive test to check a character for existence in our alphabet
27 bool exists(const char) const;
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();
49 static const char *empty_cstr;
50 static const Alphabet &empty_alphabet();
53 //! what are allowable symbols in our alphabet
55 //! internal variable to make exists() faster
56 std::set<std::string::value_type> alphabet_set;
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(); }
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);
71 alphabet_set.insert(alphabet.begin(), alphabet.end());