X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FListParser.cti;h=9847a658ab417eb234adf43baa843b2a308a964b;hb=f2f5d59e83863f3b513950173baee1b6da2aee3c;hp=a00915f5f7f7ccdb5d8d0b410c79812a072c8e4c;hpb=f73fa16ed5abdce272ac77f8b8b9ef2b9922c266;p=senf.git diff --git a/Packets/ListParser.cti b/Packets/ListParser.cti index a00915f..9847a65 100644 --- a/Packets/ListParser.cti +++ b/Packets/ListParser.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 @@ -26,6 +26,7 @@ #include "ListParser.ih" // Custom includes +#include "../Utils/senfassert.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// @@ -67,23 +68,8 @@ template prefix_ bool senf::ListParser::empty() const { - return begin() == end(); -} - -template -prefix_ typename senf::ListParser::iterator -senf::ListParser::begin() - const -{ - return iterator(i(),state(),iterator::Begin); -} - -template -prefix_ typename senf::ListParser::iterator -senf::ListParser::end() - const -{ - return iterator(i(),state(),iterator::End); + container c (*this); + return c.empty(); } template @@ -91,8 +77,9 @@ prefix_ typename senf::ListParser::value_type senf::ListParser::front() const { - BOOST_ASSERT( ! empty() ); - return *begin(); + SENF_ASSERT( ! empty() ); + container c(*this); + return *(c.begin()); } template @@ -146,62 +133,83 @@ prefix_ void senf::ListParser::resize(size_type n, Value value) c.resize(n,value); } +template +prefix_ typename senf::ListParser & +senf::ListParser::get(ListPolicy & p) +{ + return static_cast(p); +} + +template +prefix_ typename senf::ListParser const & +senf::ListParser::get(ListPolicy const & p) +{ + return static_cast(p); +} + /////////////////////////////////////////////////////////////////////////// // senf::detail::ListParser_Iterator -template -prefix_ senf::detail::ListParser_Iterator::ListParser_Iterator() -{} - -template -prefix_ senf::detail::ListParser_Iterator:: -ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, Begin_t) - : IteratorPolicy(), i_(IteratorPolicy::setBegin(i,s)), s_(s) +template +prefix_ senf::detail::ListParser_Iterator::ListParser_Iterator() {} -template -prefix_ senf::detail::ListParser_Iterator:: -ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, End_t) - : IteratorPolicy(), i_(IteratorPolicy::setEnd(i,s)), s_(s) +template +prefix_ senf::detail::ListParser_Iterator::ListParser_Iterator(Container const & c) + : c_ (&c) {} -template -prefix_ senf::detail::ListParser_Iterator:: -ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, - PacketParserBase::data_iterator p) - : IteratorPolicy(), i_(p), s_(s) +template +prefix_ senf::PacketParserBase::data_iterator +senf::detail::ListParser_Iterator::raw() + const { - IteratorPolicy::setFromPosition(i,s,p); + return c_->Container::policy::raw(*c_, *this); } -template +template prefix_ senf::PacketParserBase::data_iterator -senf::detail::ListParser_Iterator::raw() +senf::detail::ListParser_Iterator::i() const { - return IteratorPolicy::raw(i_,s_); + return i_; +} + +template +prefix_ typename senf::detail::ListParser_Iterator & +senf::detail::ListParser_Iterator::get(typename Container::policy::iterator_data & d) +{ + return static_cast(d); +} + +template +prefix_ typename senf::detail::ListParser_Iterator const & +senf::detail::ListParser_Iterator:: +get(typename Container::policy::iterator_data const & d) +{ + return static_cast(d); } -template -prefix_ ElementParser -senf::detail::ListParser_Iterator::dereference() +template +prefix_ typename senf::detail::ListParser_Iterator::value_type +senf::detail::ListParser_Iterator::dereference() const { - return ElementParser(i_,s_); + return value_type(i_,c_->state()); } -template -prefix_ bool senf::detail::ListParser_Iterator:: -equal(ListParser_Iterator const & other) +template +prefix_ bool +senf::detail::ListParser_Iterator::equal(ListParser_Iterator const & other) const { return i_ == other.i_; } -template -prefix_ void senf::detail::ListParser_Iterator::increment() +template +prefix_ void senf::detail::ListParser_Iterator::increment() { - i_ = IteratorPolicy::next(i_,s_); + i_ = c_->Container::policy::next(*c_, *this); } /////////////////////////////////////////////////////////////////////////// @@ -212,13 +220,14 @@ prefix_ void senf::detail::ListParser_Iterator::in template prefix_ senf::ListParser_Container:: ListParser_Container(parser_type const & list) - : ListPolicy(list), state_(list.state()), i_(std::distance(data().begin(),list.i())) + : ListPolicy(static_cast(list)), + state_(list.state()), i_(std::distance(data().begin(),list.i())) {} template prefix_ senf::ListParser_Container::~ListParser_Container() { - ListPolicy::update(i(),state()); + ListPolicy::update(*this); } // Accessors @@ -228,7 +237,7 @@ prefix_ typename senf::ListParser_Container::size_type senf::ListParser_Container::size() const { - ListPolicy::update(i(),state()); + ListPolicy::update(*this); return ListPolicy::size(i(),state()); } @@ -236,7 +245,7 @@ template prefix_ bool senf::ListParser_Container::empty() const { - ListPolicy::update(i(),state()); + ListPolicy::update(*this); return begin() == end(); } @@ -245,8 +254,10 @@ prefix_ typename senf::ListParser_Container::iterator senf::ListParser_Container::begin() const { - ListPolicy::update(i(),state()); - return iterator(i(),state(),iterator::Begin); + ListPolicy::update(*this); + iterator i (*this); + i.i_ = ListPolicy::setBegin(*this, i); + return i; } template @@ -254,8 +265,10 @@ prefix_ typename senf::ListParser_Container::iterator senf::ListParser_Container::end() const { - ListPolicy::update(i(),state()); - return iterator(i(),state(),iterator::End); + ListPolicy::update(*this); + iterator i (*this); + i.i_ = ListPolicy::setEnd(*this, i); + return i; } template @@ -263,7 +276,7 @@ prefix_ typename senf::ListParser_Container::value_type senf::ListParser_Container::front() const { - BOOST_ASSERT( ! empty() ); + SENF_ASSERT( ! empty() ); return *begin(); } @@ -318,7 +331,7 @@ prefix_ typename senf::ListParser_Container::parser_type senf::ListParser_Container::parser() const { - ListPolicy::update(i(),state()); + ListPolicy::update(*this); return parser_type(i(),state()); } @@ -350,7 +363,7 @@ prefix_ typename senf::ListParser_Container::size_type senf::ListParser_Container::bytes() const { - ListPolicy::update(i(),state()); + ListPolicy::update(*this); return ListPolicy::bytes(i(),state()); }