41 struct PolyTable::PolyTableImpl
43 std::vector<double> pos;
44 std::vector<std::string> data;
46 bool non_const_access;
47 PolyTableImpl() : pos(
std::vector<double>()),
48 data(
std::vector<
std::string>()),
50 non_const_access(true)
54 PolyTableImpl( std::vector<double> && __positions,
55 std::vector<std::string> && __data ) : pos(
std::forward<
std::vector<double> >(__positions)),
56 data(
std::forward<
std::vector<
std::string> >(__data)),
58 non_const_access(true)
60 std::for_each(std::begin(data),std::end(data),[
this](
const std::string & __s) {
61 if(this->pos.size()!=__s.size())
66 throw std::runtime_error(
"PolyTable: number of positions != length of data element");
72 bool empty()
const {
return pos.empty() && data.empty(); }
73 void clear() { pos.clear();data.clear();pv.clear(); }
74 bool assign(PolyTable::const_site_iterator beg,
75 PolyTable::const_site_iterator end);
76 template<
typename postype,
typename datatype>
77 bool assign_data( postype && __pos,
80 non_const_access=
true;
81 pos=std::forward<postype>(__pos);
82 data=std::forward<datatype>(__data);
83 if( std::find_if( std::begin(data),std::end(data),
84 [
this](
const std::string & __s) {
85 return __s.size() != pos.size();
96 bool PolyTable::PolyTableImpl::assign(PolyTable::const_site_iterator beg,
97 PolyTable::const_site_iterator end)
99 non_const_access =
true;
101 if(std::distance(beg,end) < 1)
return true;
102 pos.resize(std::vector<double>::size_type(end-beg));
103 pv.resize(std::vector<double>::size_type(end-beg));
104 data.resize(beg->second.length());
105 size_t nsam = beg->second.length();
106 std::string::const_iterator sb,se;
107 typedef PolyTable::const_site_iterator::difference_type DTYPE;
111 pv[unsigned(i)]=*(beg+i);
112 if ((beg+i)->second.length() != nsam)
118 pos[unsigned(i)] = (beg+i)->first;
119 sb = (beg+i)->second.begin();
120 se = (beg+i)->second.end();
124 data[unsigned(j)] += *(sb+j);
129 non_const_access =
false;
152 PolyTable::PolyTable() : impl(
std::unique_ptr<PolyTableImpl>(new PolyTableImpl()))
156 PolyTable::PolyTable( std::vector<double> __positions,
157 std::vector<std::string> __data ) : impl(
std::unique_ptr<PolyTableImpl>(new PolyTableImpl(
std::move(__positions),
162 PolyTable::PolyTable(PolyTable && rhs) : impl(
std::unique_ptr<PolyTableImpl>(new PolyTableImpl()))
164 std::swap(this->impl,rhs.impl);
167 PolyTable::PolyTable(
const PolyTable & rhs) : impl(
std::unique_ptr<PolyTableImpl>(new PolyTableImpl(*rhs.impl.get())))
171 PolyTable & PolyTable::operator=(PolyTable && rhs)
173 auto x = std::unique_ptr<PolyTableImpl>(
new PolyTableImpl());
174 std::swap(this->impl,rhs.impl);
175 std::swap(x,rhs.impl);
179 PolyTable & PolyTable::operator=(
const PolyTable & rhs)
181 this->impl->pos = rhs.impl->pos;
182 this->impl->data = rhs.impl->data;
186 PolyTable::PolyTable(PolyTable::const_site_iterator beg,
187 PolyTable::const_site_iterator end) : impl(
std::unique_ptr<PolyTableImpl>(new PolyTableImpl()))
196 PolyTable::~PolyTable (
void)
200 bool PolyTable::empty()
const 202 return impl->empty();
205 bool PolyTable::operator==(
const PolyTable &rhs)
const 207 return (this->impl->pos == rhs.impl->pos) &&
208 (this->impl->data == rhs.impl->data);
211 bool PolyTable::operator!=(
const PolyTable &rhs)
const 213 return !(*
this==rhs);
216 bool PolyTable::assign(
const std::vector<double> & __positions,
217 const std::vector<std::string> & __data )
219 return impl->assign_data(__positions,__data);
222 bool PolyTable::assign( std::vector<double> && __positions,
223 std::vector<std::string> && __data )
225 return impl->assign_data(std::move(__positions),
229 bool PolyTable::assign(PolyTable::const_site_iterator beg,
230 PolyTable::const_site_iterator end)
232 return impl->assign(beg,end);
235 void PolyTable::swap( PolyTable & pt)
237 std::swap(this->impl,pt.impl);
240 PolyTable::data_iterator PolyTable::begin()
242 impl->non_const_access=
true;
243 return impl->data.begin();
246 PolyTable::data_iterator PolyTable::end()
248 impl->non_const_access=
true;
249 return impl->data.end();
252 PolyTable::const_data_iterator PolyTable::begin()
const 254 return impl->data.begin();
257 PolyTable::const_data_iterator PolyTable::cbegin()
const 259 return impl->data.cbegin();
262 PolyTable::const_data_iterator PolyTable::end()
const 264 return impl->data.end();
267 PolyTable::const_data_iterator PolyTable::cend()
const 269 return impl->data.cend();
272 PolyTable::pos_iterator PolyTable::pbegin()
274 impl->non_const_access=
true;
275 return impl->pos.begin();
278 PolyTable::pos_iterator PolyTable::pend()
280 impl->non_const_access=
true;
281 return impl->pos.end();
284 PolyTable::const_pos_iterator PolyTable::pbegin()
const 286 return impl->pos.begin();
289 PolyTable::const_pos_iterator PolyTable::pend()
const 291 return impl->pos.end();
294 PolyTable::const_pos_iterator PolyTable::pcbegin()
const 296 return impl->pos.cbegin();
299 PolyTable::const_pos_iterator PolyTable::pcend()
const 302 return impl->pos.cend();
305 PolyTable::const_site_iterator PolyTable::sbegin()
const 307 if(impl->non_const_access ==
true)
310 impl->non_const_access=
false;
312 return impl->pv.begin();
315 PolyTable::const_site_iterator PolyTable::send()
const 317 if(impl->non_const_access ==
true)
320 impl->non_const_access=
false;
322 return impl->pv.end();
325 PolyTable::const_site_iterator PolyTable::scbegin()
const 327 if(impl->non_const_access ==
true)
330 impl->non_const_access=
false;
332 return impl->pv.cbegin();
335 PolyTable::const_site_iterator PolyTable::scend()
const 337 if(impl->non_const_access ==
true)
340 impl->non_const_access=
false;
342 return impl->pv.cend();
347 std::vector < double >
348 PolyTable::GetPositions (
void)
const 353 std::vector <std::string > PolyTable::GetData (
void)
const 358 PolyTable::const_reference PolyTable::operator[] (
const size_type & i)
const 360 return (impl->data[i]);
363 PolyTable::reference PolyTable::operator[] (
const size_type & i)
366 impl->non_const_access=
true;
367 return (impl->data[i]);
370 PolyTable::size_type PolyTable::size (
void)
const 372 return impl->data.size();
375 double PolyTable::position (
const std::vector<double>::size_type & i)
const 380 unsigned PolyTable::numsites (
void)
const 382 return unsigned(impl->pos.size());
The base class for polymorphism tables.
polySiteVector make_polySiteVector(const Sequence::PolyTable &data) __attribute__((deprecated))
Sequence::PolyTable, a virtual base class for polymorphism tables.
The namespace in which this library resides.
std::vector< polymorphicSite > polySiteVector
std::ostream & operator<<(std::ostream &s, const AlignStream< T > &c)
std::istream & operator>>(std::istream &s, AlignStream< T > &c)
declaration of Sequence::stateCounter, a class to keep track of nucleotide counts either at a site in...