X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FListBParser.cti;h=ac603c3551f7e550cfa422d92991fb08dce27264;hb=fd3a0e8ac95d1158e9ea661ddf9187b67c70169f;hp=6699dc5dacf86fb4ddc14f73e6a1c0b998961f48;hpb=f73fa16ed5abdce272ac77f8b8b9ef2b9922c266;p=senf.git diff --git a/Packets/ListBParser.cti b/Packets/ListBParser.cti index 6699dc5..ac603c3 100644 --- a/Packets/ListBParser.cti +++ b/Packets/ListBParser.cti @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Copyright (C) 2007 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund // // This program is free software; you can redistribute it and/or modify @@ -31,148 +31,168 @@ ///////////////////////////////cti.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::detail::ListBParser_Policy +// senf::detail::ListBParser_Policy + +template +prefix_ senf::detail::ListBParser_Policy::ListBParser_Policy() +{} -template -prefix_ typename senf::detail::ListBParser_Policy::size_type -senf::detail::ListBParser_Policy::bytes(iterator i, state_type s) +template +template +prefix_ +senf::detail::ListBParser_Policy::ListBParser_Policy(Arg const & arg) + : AuxPolicy (arg) +{} + +template +prefix_ typename senf::detail::ListBParser_Policy::size_type +senf::detail::ListBParser_Policy::bytes(data_iterator i, state_type s) const { - return BytesParser(i,s) + BytesParser::fixed_bytes; + return AuxPolicy::aux(i,s) + AuxPolicy::aux_bytes; } -template -prefix_ typename senf::detail::ListBParser_Policy::size_type -senf::detail::ListBParser_Policy::size(iterator i, state_type s) +template +prefix_ typename senf::detail::ListBParser_Policy::size_type +senf::detail::ListBParser_Policy::size(data_iterator i, state_type s) const { - parser_type l (i,s); - return std::distance(l.begin(),l.end()); + parser_type p (*this, i, s); + container_type c (p); + return std::distance(c.begin(),c.end()); } -template -prefix_ void senf::detail::ListBParser_Policy::init(iterator i, - state_type s) +template +prefix_ void senf::detail::ListBParser_Policy::init(data_iterator i, + state_type s) const -{} - -/////////////////////////////////////////////////////////////////////////// -// senf::detail::ListBParser_Policy::iterator_policy - -template -prefix_ typename senf::detail::ListBParser_Policy::iterator -senf::detail::ListBParser_Policy::iterator_policy:: -setBegin(iterator i, state_type s) { - return boost::next(i,BytesParser::fixed_bytes); + AuxPolicy::aux(0,i,s); } -template -prefix_ typename senf::detail::ListBParser_Policy::iterator -senf::detail::ListBParser_Policy::iterator_policy:: -setEnd(iterator i, state_type s) +/////////////////////////////////////////////////////////////////////////// +// senf::detail::ListBParser_Policy + +template +prefix_ +senf::detail::ListBParser_Policy::container_policy:: +container_policy(parser_policy const & p) + : AuxPolicy (p) { - return boost::next(i,BytesParser(i,s) + BytesParser::fixed_bytes); + data_iterator const e (boost::next(parser_type::get(p).i(),parser_type::get(p).bytes())); + data_iterator i (AuxPolicy::adjust(parser_type::get(p).i(), parser_type::get(p).state())); + for( n_=0; i!=e; + ++n_, std::advance(i,senf::bytes(ElementParser(i,parser_type::get(p).state())))) ; + container_size_ = parser_type::get(p).data().size(); } -template -prefix_ void -senf::detail::ListBParser_Policy::iterator_policy:: -setFromPosition(iterator i, state_type s, iterator p) -{} - -template -prefix_ typename senf::detail::ListBParser_Policy::iterator -senf::detail::ListBParser_Policy::iterator_policy::next(iterator i, +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::size_type +senf::detail::ListBParser_Policy::container_policy::bytes(data_iterator i, state_type s) + const { - return boost::next(i,senf::bytes(ElementParser(i,s))); + return AuxPolicy::aux(i,s) + AuxPolicy::aux_bytes; } -template -prefix_ typename senf::detail::ListBParser_Policy::iterator -senf::detail::ListBParser_Policy::iterator_policy::raw(iterator i, +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::size_type +senf::detail::ListBParser_Policy::container_policy::size(data_iterator i, state_type s) const { - return i; + return n_; } -/////////////////////////////////////////////////////////////////////////// -// senf::detail::ListBParser_Policy +template +prefix_ void senf::detail::ListBParser_Policy::container_policy:: +init(data_iterator i, state_type s) +{ + n_ = 0; + container_size_ = s->size(); + AuxPolicy::aux(0,i,s); +} -template -prefix_ -senf::detail::ListBParser_Policy::container_policy:: -container_policy(parser_type const & list) +template +prefix_ void senf::detail::ListBParser_Policy::container_policy:: +erase(container_type & c, data_iterator p) { - iterator const e (boost::next(list.i(),list.bytes())); - iterator i (boost::next(list.i(), BytesParser::fixed_bytes)); - for(n_=0; i!=e; ++n_, std::advance(i,ElementParser(i,list.state()).bytes())) ; - container_size_ = list.data().size(); + size_type b (senf::bytes(ElementParser(p,c.state()))); + AuxPolicy::aux( AuxPolicy::aux(c.i(), c.state())-b, c.i(), c.state()); + --n_; + // The container will be reduced by b bytes directly after this call + container_size_ = c.data().size()-b; } -template -prefix_ typename senf::detail::ListBParser_Policy::size_type -senf::detail::ListBParser_Policy::container_policy:: -bytes(iterator i, state_type s) - const +template +prefix_ void +senf::detail::ListBParser_Policy::container_policy:: +insert(container_type & c, data_iterator p) { - return BytesParser(i,s) + BytesParser::fixed_bytes; + size_type b (senf::bytes(ElementParser(p,c.state()))); + AuxPolicy::aux( AuxPolicy::aux(c.i(), c.state())+b, c.i(), c.state()); + ++n_; + container_size_ = c.data().size(); } -template -prefix_ typename senf::detail::ListBParser_Policy::size_type -senf::detail::ListBParser_Policy::container_policy:: -size(iterator i, state_type s) +template +prefix_ void +senf::detail::ListBParser_Policy::container_policy:: +update(container_type const & c) const { - return n_; + if (container_size_ == c.data().size()) + return; + data_iterator i (AuxPolicy::adjust(c.i(), c.state())); + data_iterator j (i); + for (size_type n (n_); n; --n, std::advance(j,senf::bytes(ElementParser(j,c.state())))) ; + aux( std::distance(i,j), c.i(), c.state() ); + container_size_ = c.data().size(); } -template -prefix_ void -senf::detail::ListBParser_Policy::container_policy:: -erase(iterator i, state_type s, iterator p) +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::data_iterator +senf::detail::ListBParser_Policy::container_policy:: +setBegin(container_type const & c, iterator_data & d) + const { - size_type b (senf::bytes(ElementParser(p,s))); - BytesParser(i,s) -= b; - --n_; - // The container will be reduced by b bytes directly after this call - container_size_ = s->size()-b; + return AuxPolicy::adjust(c.i(), c.state()); } -template -prefix_ void -senf::detail::ListBParser_Policy::container_policy:: -insert(iterator i, state_type s, iterator p) +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::data_iterator +senf::detail::ListBParser_Policy::container_policy:: +setEnd(container_type const & c, iterator_data & d) + const { - BytesParser(i,s) += senf::bytes(ElementParser(p,s)); - ++n_; - container_size_ = s->size(); + return boost::next(AuxPolicy::adjust(c.i(), c.state()),aux(c.i(),c.state())); } -template +template prefix_ void -senf::detail::ListBParser_Policy::container_policy:: -init(iterator i, state_type s) +senf::detail::ListBParser_Policy::container_policy:: +setFromPosition(container_type const & c, iterator_data & d, data_iterator p) + const +{} + +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::data_iterator +senf::detail::ListBParser_Policy::container_policy:: +next(container_type const & c, iterator_data & d) + const { - n_ = 0; - container_size_ = s->size(); + return boost::next( container_type::iterator::get(d).i(), + senf::bytes(ElementParser( container_type::iterator::get(d).i(), + c.state() )) ); } -template -prefix_ void -senf::detail::ListBParser_Policy::container_policy:: -update(iterator i, state_type s) +template +prefix_ typename senf::detail::ListBParser_Policy::container_policy::data_iterator +senf::detail::ListBParser_Policy::container_policy:: +raw(container_type const & c, iterator_data const & d) const { - if (container_size_ == s->size()) - return; - iterator j (boost::next(i,BytesParser::fixed_bytes)); - for (size_type n (n_); n; --n, std::advance(j,ElementParser(j,s).bytes())) ; - BytesParser(i,s) = std::distance(i,j) - BytesParser::fixed_bytes; - container_size_ = s->size(); + return container_type::iterator::get(d).i(); } ///////////////////////////////cti.e///////////////////////////////////////