+}
+
+std::string Alphabet::create_complement_map(const std::string& ra) const
+{
+ if (ra.size() == 0) {
+ // reverse complement is undefined
+ throw mussa_error("no reverse complement");
+ }
+ std::string rc_map(256,'~');
+
+ for(int i = 0; alphabet[i] and ra[i]; ++i) {
+ rc_map[ alphabet[i] ] = ra[i];
+ }
+ return rc_map;
+}
+
+boost::shared_ptr<std::string> Alphabet::reverse_complement(const std::string &seq) const
+{
+ boost::shared_ptr<std::string> new_seq(new std::string());
+
+ new_seq->reserve(seq.size());
+
+ for(std::string::const_reverse_iterator seq_i = seq.rbegin();
+ seq_i != seq.rend();
+ ++seq_i)
+ {
+ new_seq->append(1, complement_map[ *seq_i ]);
+ }
+ return new_seq;