26 #ifndef SHORE_GENOME_NUCLEOTIDE_HPP__
27 #define SHORE_GENOME_NUCLEOTIDE_HPP__
35 #include <boost/utility/enable_if.hpp>
36 #include <boost/type_traits.hpp>
93 static const char*
const m_abbreviations;
94 static const std::string m_basenameTable[16];
97 static const base UNPACK_LUT[16];
100 static const int m_gctable[16];
113 for(
int i=0;i<256;++i)
119 LUT[i]=nuc::ADENINE;
break;
121 LUT[i]=nuc::CYTOSINE;
break;
123 LUT[i]=nuc::GUANINE;
break;
126 LUT[i]=nuc::THYMINE;
break;
128 LUT[i]=nuc::PURINE;
break;
130 LUT[i]=nuc::PYRIMIDINE;
break;
132 LUT[i]=nuc::WEAK;
break;
134 LUT[i]=nuc::STRONG;
break;
136 LUT[i]=nuc::AMINO;
break;
138 LUT[i]=nuc::KETO;
break;
140 LUT[i]=nuc::NOT_GUANINE;
break;
142 LUT[i]=nuc::NOT_ADENINE;
break;
144 LUT[i]=nuc::NOT_THYMINE;
break;
146 LUT[i]=nuc::NOT_CYTOSINE;
break;
149 LUT[i]=nuc::ANY;
break;
158 static const symtab m_symtab;
165 return m_abbreviations[b];
171 return m_basenameTable[b];
177 return (b==THYMINE)?
'U':
enc(b);
183 return (b==THYMINE)?
"uracil":
s_enc(b);
190 const unsigned char low=b>>2;
191 const unsigned char high=(b<<2)&12;
192 return base(high|low);
198 return base((b&AMINO)?(b^AMINO):(b^KETO));
204 return base((b&PURINE)?(b^PURINE):(b^PYRIMIDINE));
212 if((b&replacewhat)==0)
214 return static_cast<base>((b&(~replacewhat))|replacewith);
223 return m_symtab.LUT[abbr];
229 return static_cast<base>(
230 shore::match_arg_idx<std::runtime_error>(name,
238 return (b&1)+((b>>1)&1)+((b>>2)&1)+((b>>3)&1);
259 return UNPACK_LUT[b];
263 template<
typename Iter>
265 typename boost::enable_if<boost::is_same<
typename std::iterator_traits<Iter>::value_type,
266 char> >::type *dummy=0)
276 template<
typename Iter>
278 typename boost::enable_if<boost::is_same<
typename std::iterator_traits<Iter>::value_type,
279 char> >::type *dummy=0)
288 template<
typename Iter>
290 typename boost::enable_if<boost::is_same<
typename std::iterator_traits<Iter>::value_type,
291 base> >::type *dummy=0)
306 template<
typename Iter>
308 typename boost::enable_if<boost::is_same<
typename std::iterator_traits<Iter>::value_type,
316 if(unpack(*b)!=
comp(unpack(*e)))
324 template<
typename Iter>
326 typename boost::enable_if<boost::is_same<
typename std::iterator_traits<Iter>::value_type,
327 char> >::type *dummy=0)
348 for(
long i=0,j=seq.size()-1;i<=j;++i,--j)
356 template<
typename Iter>
357 static void to_string(Iter beg,Iter
end,std::string& res)
360 for(Iter i=beg;i!=
end;++i)
362 const typename std::iterator_traits<Iter>::value_type v=*i;
363 res.push_back(
enc(static_cast<base>(v)));
367 template<
typename Iter>
368 static std::string to_string(Iter beg,Iter end)
371 to_string(beg,end,res);
375 template<
typename Iter>
376 static void unpack_to_string(Iter beg,Iter end,std::string& res)
379 for(Iter i=beg;i!=
end;++i)
381 const typename std::iterator_traits<Iter>::value_type v=*i;
382 res.push_back(
enc(unpack(static_cast<packed_base>(v))));
386 template<
typename Iter>
387 static Iter unpack_to_string(
388 Iter beg,Iter end,std::string& res,
size_t nmax)
392 for(i=beg;(i!=
end)&&(nmax>0);++i)
394 const typename std::iterator_traits<Iter>::value_type v=*i;
395 res.push_back(
enc(unpack(static_cast<packed_base>(v))));
401 template<
typename Iter>
402 static std::string unpack_to_string(Iter beg,Iter end)
405 unpack_to_string(beg,end,res);
419 #endif // SHORE_GENOME_NUCLEOTIDE_HPP__