X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FParseVec.ct;h=de1f131c767ed5587b58a759f5dbfd0109a09f75;hb=a3d3979b7daaf22ea63ca356edbfa8047dff7b78;hp=9aabd74ac34726ef3014b564a0ee430d4bab4668;hpb=145f6a7d0f3a6aaa77b3625351c952d24cb0b8a1;p=senf.git diff --git a/Packets/ParseVec.ct b/Packets/ParseVec.ct index 9aabd74..de1f131 100644 --- a/Packets/ParseVec.ct +++ b/Packets/ParseVec.ct @@ -22,54 +22,89 @@ // Definition of non-inline template funPacketRegistry.ons -//#include "ParseVec.ih" +#include "ParseVec.ih" // Custom includes #define prefix_ ///////////////////////////////ct.p//////////////////////////////////////// -template -template -prefix_ void -senf::Parse_Vector_wrapper::insert(iterator pos, - Value const & t) +/////////////////////////////////////////////////////////////////////////// +// senf::Parse_Vector + +template +prefix_ void senf::Parse_Vector::init() + const +{ + sizer_.init(i(),state()); + iterator i (begin()); + iterator const e (end()); + for (; i!=e; ++i) + i->init(); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::Parse_Vector_Container + +template +prefix_ void senf::Parse_Vector_Container::init() + const +{ + iterator i (begin()); + iterator const e (end()); + for (; i!=e; ++i) + i->init(); +} + +// Mutators + +template +prefix_ typename senf::Parse_Vector_Container::iterator +senf::Parse_Vector_Container::shift(iterator pos, size_type n) { - size_type ix(pos.raw()-container_.begin()); - shift(pos); - Parser(container_.begin()+ix).value(t); + size_type ix (std::distance(data().begin(),pos.raw())); + data().insert(pos.raw(),n*ElementParser::fixed_bytes,0); + setSize(size()+n); + return iterator(boost::next(data().begin(),ix),state()); } -template +template template -prefix_ void -senf::Parse_Vector_wrapper::insert(iterator pos, +prefix_ void senf::Parse_Vector_Container::insert(iterator pos, size_type n, Value const & t) { - size_type ix(pos.raw()-container_.begin()); - shift(pos,n); - typename Container::iterator j (container_.begin()+ix); - for (; n; --n, j+=Parser::bytes()) - Parser(j).value(t); + for (iterator j (shift(pos,n)); n; --n, ++j) + *j << t; +} + +template +template +prefix_ void senf::Parse_Vector_Container:: +insert(iterator pos, ForwardIterator f, ForwardIterator l, + typename boost::disable_if< boost::is_convertible >::type *) +{ + for (iterator j (shift(pos,std::distance(f,l))); f!=l; ++f,++j) + *j << *f; } -template -template -prefix_ void -senf::Parse_Vector_wrapper::insert(iterator pos, - InputIterator f, - InputIterator l) +template +prefix_ void senf::Parse_Vector_Container::resize(size_type n) +{ + if (size()>=n) + erase(boost::next(begin(),n),end()); + else + push_back_space(n-size()); +} + +template +template +prefix_ void senf::Parse_Vector_Container::resize(size_type n, Value value) { - /** \todo This might be horribly inefficient ... we need to - specialize for random_access and forward iterators, where we - can count the distance */ - - size_type ix(pos.raw()-container_.begin()); - for (;f!=l;++f) { - insert(container_.begin()+ix,*f); - ix += Parser::bytes(); - } + if (size()>=n) + erase(boost::next(begin(),n),end()); + else + push_back(value,n-size()); } ///////////////////////////////ct.e////////////////////////////////////////