Move alphabet type into SeqString
[mussa.git] / alg / alphabet.cpp
1 #include <stdexcept>
2
3 #include "alg/alphabet.hpp"
4
5 // some standard dna alphabets 
6 // Include nl (\012), and cr (\015) to make sequence parsing eol 
7 // convention independent.
8 const char *Alphabet::reduced_dna_cstr = "AaCcGgTtNn\012\015";
9 const char *Alphabet::reduced_rna_cstr = "AaCcGgUuNn\012\015";
10 const char *Alphabet::reduced_nucleic_cstr = "AaCcGgTtUuNn\012\015";
11 //! this is the general iupac alphabet for nucleotides
12 const char *Alphabet::nucleic_cstr =
13   "AaCcGgTtUuRrYyMmKkSsWwBbDdHhVvNn-~.?\012\015";
14 //! the protein alphabet
15 const char *Alphabet::protein_cstr = 
16   "AaCcDdEeFfGgHhIiKkLlMmNnPpQqRrSsTtVvWwYy\012\015";
17 const char *Alphabet::empty_cstr = "";
18
19 const Alphabet& Alphabet::reduced_dna_alphabet() {
20   static Alphabet *a = new Alphabet(reduced_dna_cstr);
21   return *a;
22 }
23 const Alphabet& Alphabet::reduced_rna_alphabet() {
24   static Alphabet *a = new Alphabet(reduced_rna_cstr);
25   return *a;
26 }
27 const Alphabet& Alphabet::reduced_nucleic_alphabet() {
28   static Alphabet *a = new Alphabet(reduced_nucleic_cstr);
29   return *a;
30 }
31 const Alphabet& Alphabet::nucleic_alphabet() {
32   static Alphabet *a = new Alphabet(nucleic_cstr);
33   return *a;
34 }
35 const Alphabet& Alphabet::protein_alphabet() {
36   static Alphabet *a = new Alphabet(protein_cstr);
37   return *a;
38 }
39 const Alphabet& Alphabet::empty_alphabet() {
40   static Alphabet *a = new Alphabet(empty_cstr);
41   return *a;
42 }
43
44 Alphabet::Alphabet(const char *a) :
45   alphabet(a)
46 {
47   alphabet_set.insert(alphabet.begin(), alphabet.end());  
48
49
50 void Alphabet::assign(const Alphabet& a)
51 {
52   alphabet = a.alphabet;
53   alphabet_set.clear();
54   alphabet_set.insert(alphabet.begin(), alphabet.end());
55 }
56
57 bool operator==(const Alphabet& x, const Alphabet& y)
58 {
59   return x.alphabet == y.alphabet; 
60 }
61
62 std::ostream& operator<<(std::ostream& out, const Alphabet& a)
63 {
64   out << a.alphabet;
65 }
66
67 bool Alphabet::exists(const char c) const
68 {
69   return (alphabet_set.find(c) != alphabet_set.end());
70 }
71
72 const Alphabet& Alphabet::get_alphabet(AlphabetRef alpha)
73 {
74   switch (alpha) {
75     case ::reduced_dna_alphabet:
76       return Alphabet::reduced_dna_alphabet();
77     case ::reduced_rna_alphabet:
78       return Alphabet::reduced_rna_alphabet();
79     case ::reduced_nucleic_alphabet:
80       return Alphabet::reduced_nucleic_alphabet();
81     case ::nucleic_alphabet:
82       return Alphabet::nucleic_alphabet();
83     case ::protein_alphabet:
84       return Alphabet::protein_alphabet();    
85     default:
86       throw std::runtime_error("unrecognized alphabet type");
87       break;
88   }
89 }