X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FParseVec.cti;h=14ac2d648093e5e8e5661ae843a5e0367e7632ac;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=bf4f7a9253f792fd83cb5f02b7c37af017ed057f;hpb=85ab07d100a382467a42e19d741d403a7a96c951;p=senf.git diff --git a/Packets/ParseVec.cti b/Packets/ParseVec.cti index bf4f7a9..14ac2d6 100644 --- a/Packets/ParseVec.cti +++ b/Packets/ParseVec.cti @@ -20,201 +20,368 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Definition of inline template functions +/** \file + \brief ParseVec inline template implementation */ -//#include "ParseVec.ih" +#include "ParseVec.ih" // Custom includes #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// -template -prefix_ senf::Parse_Vector:: -Parse_Vector(SizeParser const & size) - : size_(size) +/////////////////////////////////////////////////////////////////////////// +// senf::Parse_Vector + +template +prefix_ senf::Parse_Vector::Parse_Vector(data_iterator i, state_type s) + : PacketParserBase(i,s), sizer_() {} -template -prefix_ senf::Parse_Vector:: -Parse_Vector(size_parser const & size, Iterator const & i) - : ParserBase(i), size_(size) +template +prefix_ senf::Parse_Vector::Parse_Vector(Sizer sizer, data_iterator i, + state_type s) + : PacketParserBase(i,s), sizer_(sizer) {} -template -prefix_ unsigned senf::Parse_Vector::bytes() +template +prefix_ typename senf::Parse_Vector::size_type +senf::Parse_Vector::bytes() const { - return Parser::bytes()*size(); + return size()*ElementParser::fixed_bytes + sizer_.bytes(i(),state()); } -template -prefix_ void -senf::Parse_Vector::check(Iterator const & e) +// Container interface + +template +prefix_ typename senf::Parse_Vector::size_type +senf::Parse_Vector::size() const { - return e-this->i() >= bytes(); + return sizer_.size(i(),state()); } -template -prefix_ void senf::Parse_Vector::init() +template +prefix_ bool senf::Parse_Vector::empty() const { - iterator e (end()); - for (iterator i (begin()); i!=e; ++i) i->init(); + return size()==0; } -/////////////////////////////////////////////////////////////////////////// +template +prefix_ typename senf::Parse_Vector::iterator +senf::Parse_Vector::begin() + const +{ + return iterator(sizer_.begin(i(),state()),state()); +} -template -prefix_ typename senf::Parse_Vector::size_type -senf::Parse_Vector::size() +template +prefix_ typename senf::Parse_Vector::iterator +senf::Parse_Vector::end() const { - return size_.value(); + return boost::next(begin(),size()); } -template -prefix_ bool senf::Parse_Vector::empty() +template +prefix_ typename senf::Parse_Vector::value_type +senf::Parse_Vector::operator[](difference_type i) const { - return size()==0; + return begin()[i]; } -template -prefix_ -typename senf::Parse_Vector::iterator -senf::Parse_Vector::begin() +template +prefix_ typename senf::Parse_Vector::value_type +senf::Parse_Vector::front() const { - return iterator(this->i()); + return begin()[0]; } -template -prefix_ -typename senf::Parse_Vector::iterator -senf::Parse_Vector::end() +template +prefix_ typename senf::Parse_Vector::value_type +senf::Parse_Vector::back() const { - return iterator(this->i()+bytes()); + return begin()[size()-1]; } -template -prefix_ -typename senf::Parse_Vector::range_type -senf::Parse_Vector::range() +// Mutators + +template +template +prefix_ void senf::Parse_Vector::push_back(Value value, size_type n) const { - return std::make_pair(begin(),end()); + container c (*this); + c.push_back(value,n); } -template -prefix_ -typename senf::Parse_Vector::range_type -senf::Parse_Vector::value() +template +prefix_ void senf::Parse_Vector::push_back_space(size_type n) const { - return range(); + container c (*this); + c.push_back_space(n); } -template -prefix_ -typename senf::Parse_Vector::value_type -senf::Parse_Vector::operator[](difference_type i) +template +template +prefix_ void senf::Parse_Vector::push_front(Value value, size_type n) const { - return begin()[i]; + container c (*this); + c.push_front(value,n); +} + +template +prefix_ void senf::Parse_Vector::push_front_space(size_type n) + const +{ + container c (*this); + c.push_front_space(n); +} + +template +prefix_ void senf::Parse_Vector::resize(size_type n) + const +{ + container c (*this); + c.resize(n); +} + +template +template +prefix_ void senf::Parse_Vector::resize(size_type n, Value value) + const +{ + container c (*this); + c.resize(n,value); } /////////////////////////////////////////////////////////////////////////// +// senf::SimpleSizeParser + +template +prefix_ typename senf::detail::Parse_VectorN_Sizer::size_type +senf::detail::Parse_VectorN_Sizer::size(iterator i, state_type s) + const +{ + return SizeParser(i,s).value(); +} + +template +prefix_ void senf::detail::Parse_VectorN_Sizer::size(iterator i, state_type s, + size_type v) + const +{ + SizeParser(i,s).value(v); +} + +template +prefix_ typename senf::detail::Parse_VectorN_Sizer::iterator +senf::detail::Parse_VectorN_Sizer::begin(iterator i, state_type s) + const +{ + return boost::next(i,SizeParser::fixed_bytes); +} + +template +prefix_ typename senf::detail::Parse_VectorN_Sizer::size_type +senf::detail::Parse_VectorN_Sizer::bytes(iterator i, state_type s) + const +{ + return SizeParser::fixed_bytes; +} + +template +prefix_ void senf::detail::Parse_VectorN_Sizer::init(iterator i, state_type s) + const +{} + +/////////////////////////////////////////////////////////////////////////// // senf::Parse_Vector_wrapper -template -template -prefix_ senf::Parse_Vector_wrapper:: -Parse_Vector_wrapper(Parse_Vector const & vector, Container & container) - : i_(vector.i()-container.begin()), size_i_(vector.size_.i()-container.begin()), - container_(container) +// structors and default members + +// hm ... be careful here ! the data() member is called in an incompletely intitialized +// instance. However, data() only depends on state_ which is initialized before the call. YOU MUST +// NOT CHANGE THE ORDERING OF THE DATA MEMBERS +template +prefix_ senf::Parse_Vector_Container:: +Parse_Vector_Container(parser_type const & vector) + : sizer_ (vector.sizer_), state_ (vector.state()), + i_ (std::distance(data().begin(),vector.i())) {} -template -prefix_ typename senf::Parse_Vector_wrapper::size_type -senf::Parse_Vector_wrapper::size() +// accessors + +template +prefix_ typename senf::Parse_Vector_Container::size_type +senf::Parse_Vector_Container::size() const { - return SizeParser(container_.begin()+size_i_).value(); + return sizer_.size(i(),state()); } -template -prefix_ bool senf::Parse_Vector_wrapper::empty() +template +prefix_ bool senf::Parse_Vector_Container::empty() const { return size() == 0; } -template -prefix_ typename senf::Parse_Vector_wrapper::iterator -senf::Parse_Vector_wrapper::begin() +template +prefix_ typename senf::Parse_Vector_Container::iterator +senf::Parse_Vector_Container::begin() const { - return iterator(container_.begin() + i_); + return iterator(sizer_.begin(i(),state()),state()); } -template -prefix_ typename senf::Parse_Vector_wrapper::iterator -senf::Parse_Vector_wrapper::end() +template +prefix_ typename senf::Parse_Vector_Container::iterator +senf::Parse_Vector_Container::end() const { - return iterator(container_.begin() + i_ + Parser::bytes()*size()); + return boost::next(begin(),size()); } -template -prefix_ typename senf::Parse_Vector_wrapper::range_type -senf::Parse_Vector_wrapper::range() +template +prefix_ typename senf::Parse_Vector_Container::value_type +senf::Parse_Vector_Container::operator[](difference_type i) const { - return std::make_pair(begin(), end()); + return begin()[i]; } -template -prefix_ typename senf::Parse_Vector_wrapper::value_type -senf::Parse_Vector_wrapper::operator[](difference_type i) +template +prefix_ typename senf::Parse_Vector_Container::value_type +senf::Parse_Vector_Container::front() const { - return begin()[i]; + return begin()[0]; +} + +template +prefix_ typename senf::Parse_Vector_Container::value_type +senf::Parse_Vector_Container::back() + const +{ + return begin()[size()-1]; +} + +// Mutators + +template +template +prefix_ void senf::Parse_Vector_Container::insert(iterator pos, + Value const & t) +{ + *shift(pos) << t; +} + +template +prefix_ void senf::Parse_Vector_Container::erase(iterator pos, size_type n) +{ + data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes)); + setSize(size()-n); +} + +template +prefix_ void senf::Parse_Vector_Container::erase(iterator f, iterator l) +{ + erase(f,std::distance(f,l)); +} + +template +prefix_ void senf::Parse_Vector_Container::clear() +{ + erase(begin(),end()); +} + +template +template +prefix_ void senf::Parse_Vector_Container::push_back(Value value, + size_type n) +{ + insert(end(),n,value); } -template -prefix_ void senf::Parse_Vector_wrapper::shift(iterator pos, - size_type n) +template +prefix_ void senf::Parse_Vector_Container::push_back_space(size_type n) { - container_.insert(pos.raw(),n*Parser::bytes(),0); - SizeParser(container_.begin()+size_i_) += n; + shift(end(),n); } -template -prefix_ void senf::Parse_Vector_wrapper::erase(iterator pos, - size_type n) +template +template +prefix_ void senf::Parse_Vector_Container::push_front(Value value, + size_type n) { - container_.erase(pos.raw(),pos.raw()+n*Parser::bytes()); - SizeParser(container_.begin()+size_i_) -= n; + insert(begin(),n,value); } -template -prefix_ void senf::Parse_Vector_wrapper::erase(iterator f, - iterator l) +template +prefix_ void senf::Parse_Vector_Container::push_front_space(size_type n) { - erase(f,l-f); + shift(begin(),n); } -template -prefix_ void senf::Parse_Vector_wrapper::clear() +// Parser interface + +template +prefix_ typename senf::Parse_Vector_Container::parser_type +senf::Parse_Vector_Container::parser() + const +{ + return parser_type(i(),state()); +} + +template +prefix_ typename senf::Parse_Vector_Container::data_iterator +senf::Parse_Vector_Container::i() + const +{ + return boost::next(data().begin(),i_); +} + +template +prefix_ typename senf::Parse_Vector_Container::state_type +senf::Parse_Vector_Container::state() + const +{ + return state_; +} + +template +prefix_ senf::PacketData & +senf::Parse_Vector_Container::data() + const +{ + return *state_; +} + +template +prefix_ typename senf::Parse_Vector_Container::size_type +senf::Parse_Vector_Container::bytes() + const +{ + return size()*ElementParser::fixed_bytes + sizer_.bytes(i(),state()); +} + +// private members + +template +prefix_ void senf::Parse_Vector_Container::setSize(size_type value) { - container_.erase(container_.begin()+i_,container_.begin()+i_+size()*Parser::bytes()); - SizeParser(container_.begin()+size_i_) = 0; + sizer_.size(i(),state(),value); } -///////////////////////////////cti.e/////////////////////////////////////// +/////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ @@ -224,4 +391,6 @@ prefix_ void senf::Parse_Vector_wrapper::clear() // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: