X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FParseVec.hh;h=21239e8be0498b83a330454bda0e2b4d9b2c7dfb;hb=05150cf5e05d2dc2c41fd531649131de7acdd2f1;hp=3b2dc38276f4b93b8a10dda639a9eea9a2e34c27;hpb=c52cd7d87dbb525c1267aad27391b8b7365dbb57;p=senf.git diff --git a/Packets/ParseVec.hh b/Packets/ParseVec.hh index 3b2dc38..21239e8 100644 --- a/Packets/ParseVec.hh +++ b/Packets/ParseVec.hh @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2006 +// Copyright (C) 2006 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) // Kompetenzzentrum fuer Satelitenkommunikation (SatCom) // Stefan Bund @@ -24,103 +24,116 @@ #define HH_ParseVec_ 1 // Custom includes -#include // for std::pair #include -#include // for boost::noncopyable -#include "ParserBase.hh" +#include +#include +#include +#include "PacketParser.hh" #include "ParseArray.hh" // for Parse_Array_iterator //#include "ParseVec.mpp" ///////////////////////////////hh.p//////////////////////////////////////// -namespace satcom { -namespace pkf { +namespace senf { - template class Parse_Vector_wrapper; + template class Parse_Vector_Container; - template - struct Parse_Vector : public ParserBase + /** \brief + + \todo Make the sizer a private baseclass to profit from the empty-base-class optimization + */ + template + struct Parse_Vector : public PacketParserBase { - typedef typename SizeParser::template rebind::parser size_parser; - - /////////////////////////////////////////////////////////////////////////// - // Parser interface + Parse_Vector(data_iterator i, state_type s); + Parse_Vector(Sizer sizer, data_iterator i, state_type s); - template - struct rebind { typedef Parse_Vector parser; }; - typedef Iterator byte_iterator; - - explicit Parse_Vector(SizeParser const & size); - Parse_Vector(size_parser const & size, Iterator const & i); - - unsigned bytes() const; - void check(Iterator const & e) const; + size_type bytes() const; void init() const; + static const size_type init_bytes = Sizer::init_bytes; + /////////////////////////////////////////////////////////////////////////// // Container interface - typedef typename Parser::template rebind::parser value_type; - typedef impl::Parse_Array_iterator iterator; - typedef unsigned size_type; - typedef int difference_type; - typedef std::pair range_type; - - template - struct wrapper { typedef Parse_Vector_wrapper t; }; + typedef ElementParser value_type; + typedef detail::Parse_Array_iterator iterator; + typedef iterator const_iterator; + typedef Parse_Vector_Container container; size_type size() const; bool empty() const; iterator begin() const; iterator end() const; - range_type range() const; - range_type value() const; value_type operator[](difference_type i) const; + value_type front() const; + value_type back() const; - private: - size_parser size_; + // Mutators - template friend class Parse_Vector_wrapper; + // The mutators provided here are those which don't take an iterator argument. + // If you need to pass an iterator it is much simpler and cleaner to use the + // 'container' wrapper + + template void push_back (Value value, size_type n=1) const; + void push_back_space (size_type n=1) const; + template void push_front (Value value, size_type n=1) const; + void push_front_space (size_type n=1) const; + void resize (size_type n) const; + template void resize (size_type n, Value value) const; + + private: + Sizer sizer_; + + friend class Parse_Vector_Container; + }; + + namespace detail { template class Parse_VectorN_Sizer; } + + template + struct Parse_VectorN + { + typedef Parse_Vector< ElementParser, + detail::Parse_VectorN_Sizer > parser; }; /** \brief - + Holds a reference to the container ! */ - template - class Parse_Vector_wrapper - : public boost::noncopyable + template + class Parse_Vector_Container { public: /////////////////////////////////////////////////////////////////////////// // Types - typedef Container container; - typedef SizeParser size_parser; - typedef typename Parser::byte_iterator byte_iterator; - typedef Parser value_type; - typedef impl::Parse_Array_iterator iterator; - typedef unsigned size_type; - typedef int difference_type; - typedef std::pair range_type; + typedef Parse_Vector parser_type; + typedef PacketParserBase::data_iterator data_iterator; + typedef PacketParserBase::size_type size_type; + typedef PacketParserBase::difference_type difference_type; + typedef ElementParser value_type; + typedef detail::Parse_Array_iterator iterator; + typedef iterator const_iterator; + typedef PacketParserBase::state_type state_type; /////////////////////////////////////////////////////////////////////////// ///\name Structors and default members ///@{ - template - Parse_Vector_wrapper(Parse_Vector const & vector, Container & container); - // no default constructor - // no copy + // default copy // default destructor - // no conversion constructors + // conversion constructors + + Parse_Vector_Container(parser_type const & vector); ///@} /////////////////////////////////////////////////////////////////////////// - ///\name APacketRegistry.essors + + ///\name Accessors ///@{ size_type size() const; @@ -128,39 +141,61 @@ namespace pkf { iterator begin() const; iterator end() const; - range_type range() const; value_type operator[](difference_type i) const; + value_type front() const; + value_type back() const; ///@} - /////////////////////////////////////////////////////////////////////////// ///\name Mutators ///@{ - void shift(iterator pos, size_type n=1); + iterator shift(iterator pos, size_type n=1); template - void insert(iterator pos, Value const & t); + void insert(iterator pos, Value const & t); template - void insert(iterator pos, size_type n, Value const & t); - template - void insert(iterator pos, InputIterator f, InputIterator l); - - void erase(iterator pos, size_type n=1); - void erase(iterator f, iterator l); - void clear(); + void insert(iterator pos, size_type n, Value const & t); + template + void insert(iterator pos, ForwardIterator f, ForwardIterator l, + typename boost::disable_if< boost::is_convertible >::type * = 0); + + void erase(iterator pos, size_type n=1); + void erase(iterator f, iterator l); + void clear(); + + template void push_back (Value value, size_type n=1); + void push_back_space (size_type n=1); + template void push_front (Value value, size_type n=1); + void push_front_space (size_type n=1); + void resize (size_type n); + template void resize (size_type n, Value value); + + ///@} + + ///\name Parser interface + ///@{ + + parser_type parser() const; + data_iterator i() const; + state_type state() const; + PacketData & data() const; + size_type bytes() const; + void init() const; + ///@} protected: private: - + void setSize(size_type value); + + Sizer sizer_; + state_type state_; size_type i_; - size_type size_i_; - Container & container_; }; -}} +} ///////////////////////////////hh.e//////////////////////////////////////// //#include "ParseVec.cci" @@ -171,5 +206,10 @@ namespace pkf { // Local Variables: // mode: c++ -// c-file-style: "satcom" +// fill-column: 100 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: