X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FParseVec.ct;h=d76caf3ef71ff3a2c819542bb03620c9a8dd9f2b;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=6ef4055edb91451dd94086acf24f8dcafa1eeb1e;hpb=9e333f86141055c5248a46028a571c932648696a;p=senf.git diff --git a/Packets/ParseVec.ct b/Packets/ParseVec.ct index 6ef4055..d76caf3 100644 --- a/Packets/ParseVec.ct +++ b/Packets/ParseVec.ct @@ -20,56 +20,100 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Definition of non-inline template funPacketRegistry.ons +/** \file + \brief ParseVec non-inline template implementation */ -//#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; +} + +#ifndef DOXYGEN +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; } +#else +template +template +prefix_ void senf::Parse_Vector_Container:: +insert(iterator pos, ForwardIterator f, ForwardIterator l) +{} +#endif -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//////////////////////////////////////// @@ -82,4 +126,6 @@ senf::Parse_Vector_wrapper::insert(iterator pos, // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: