X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FParseInt.ih;h=80b8d7f2c5c027d2a85f9e6ca05df1f0284a9a92;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=2eca9887032f44d50326a9a29b818c1de7775320;hpb=85ab07d100a382467a42e19d741d403a7a96c951;p=senf.git diff --git a/Packets/ParseInt.ih b/Packets/ParseInt.ih index 2eca988..80b8d7f 100644 --- a/Packets/ParseInt.ih +++ b/Packets/ParseInt.ih @@ -20,20 +20,31 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief ParseInt internal header */ + #ifndef IH_ParseInt_ #define IH_ParseInt_ 1 // Custom includes +#include "PacketTypes.hh" ///////////////////////////////ih.p//////////////////////////////////////// namespace senf { - -namespace impl { +namespace detail { +namespace packet { /////////////////////////////////////////////////////////////////////////// // Integer operators + /** \brief Internal: Integer operation mixin for integer parsers + + \internal + + This class contains all the integer operations supported by the integer parsers. It is + inherited by each integer parser. + */ template class ParseIntOps { @@ -67,14 +78,14 @@ namespace impl { # undef mutator Derived const & operator ++ () - { derived().value( derived.value()+1 ); return derived(); } + { derived().value( derived().value()+1 ); return derived(); } Derived const & operator -- () - { derived().value( derived.value()-1 ); return derived(); } + { derived().value( derived().value()-1 ); return derived(); } - Derived const & operator ++ (int) - { Value v (derived.value()); derived().value( v+1 ); return v; } - Derived const & operator -- (int) - { Value v (derived.value()); derived().value( v-1 ); return v; } + Value operator ++ (int) + { Value v (derived().value()); derived().value( v+1 ); return v; } + Value operator -- (int) + { Value v (derived().value()); derived().value( v-1 ); return v; } private: Derived & derived() { return *static_cast(this); } @@ -84,41 +95,59 @@ namespace impl { /////////////////////////////////////////////////////////////////////////// // Network byte order integer extraction - template - boost::uint16_t parse_uint16(Iterator const & i) + /** \brief Internal: Extract 16bit network byte order value + + \internal + */ + inline boost::uint16_t parse_uint16(iterator i) { return i[1] | i[0]<<8; } - template - void write_uint16(Iterator const & i, boost::uint16_t v) + /** \brief Internal: Write 16bit network byte order value + + \internal + */ + inline void write_uint16(iterator i, boost::uint16_t v) { i[0] = ( v >> 8 ) & 0xff; i[1] = ( v ) & 0xff; } - template - boost::uint32_t parse_uint24(Iterator const & i) + /** \brief Internal: Extract 24bit network byte order value + + \internal + */ + inline boost::uint32_t parse_uint24(iterator i) { return i[2] | i[1]<<8 | i[0]<<16; } - template - void write_uint24(Iterator const & i, boost::uint32_t v) + /** \brief Internal: Write 24bit network byte order value + + \internal + */ + inline void write_uint24(iterator i, boost::uint32_t v) { i[0] = ( v >> 16 ) & 0xff; i[1] = ( v >> 8 ) & 0xff; i[2] = ( v ) & 0xff; } - template - boost::uint32_t parse_uint32(Iterator const & i) + /** \brief Internal: Extract 32bit network byte order value + + \internal + */ + inline boost::uint32_t parse_uint32(iterator i) { return i[3] | i[2]<<8 | i[1]<<16 | i[0]<<24; } - template - void write_uint32(Iterator const & i, boost::uint32_t v) + /** \brief Internal: Write 32bit network byte order value + + \internal + */ + inline void write_uint32(iterator i, boost::uint32_t v) { i[0] = ( v >> 24 ) & 0xff; i[1] = ( v >> 16 ) & 0xff; @@ -129,17 +158,21 @@ namespace impl { /////////////////////////////////////////////////////////////////////////// // bitfield extraction - template + // Doxygen doesn't like this stuff ... + +# ifndef DOXYGEN + + template struct parse_bitfield_i { - static boost::uint32_t parse(Iterator const & i) { + static boost::uint32_t parse(iterator i) { return ( ( ( parse_uint32(i+offset+1)>>(40-end) ) // Beware of sign extension !! & boost::low_bits_mask_t<32-(40-end)>::sig_bits ) | (i[offset]<<(32-(40-end))) ) & boost::low_bits_mask_t::sig_bits; } - static void write(Iterator const & i, boost::uint32_t v) { + static void write(iterator i, boost::uint32_t v) { write_uint32(i+offset+1, (parse_uint32(i+offset+1) & ~(boost::low_bits_mask_t::sig_bits<<(40-end))) | ((v & boost::low_bits_mask_t::sig_bits) << (40-end))); @@ -148,71 +181,84 @@ namespace impl { } }; - template - struct parse_bitfield_i + template + struct parse_bitfield_i { - static boost::uint32_t parse(Iterator const & i) { + static boost::uint32_t parse(iterator i) { return ( parse_uint32(i+offset)>>(32-end) ) & boost::low_bits_mask_t::sig_bits; } - static void write(Iterator const & i, boost::uint32_t v) { + static void write(iterator i, boost::uint32_t v) { write_uint32(i+offset, (parse_uint32(i+offset) & ~(boost::low_bits_mask_t::sig_bits<<(32-end))) | ((v & boost::low_bits_mask_t::sig_bits) << (32-end))); } }; - template - struct parse_bitfield_i + template + struct parse_bitfield_i { - static boost::uint32_t parse(Iterator const & i) { + static boost::uint32_t parse(iterator i) { return ( parse_uint24(i+offset)>>(24-end) ) & boost::low_bits_mask_t::sig_bits; } - static void write(Iterator const & i, boost::uint32_t v) { + static void write(iterator i, boost::uint32_t v) { write_uint24(i+offset, (parse_uint24(i+offset) & ~(boost::low_bits_mask_t::sig_bits<<(24-end))) | ((v & boost::low_bits_mask_t::sig_bits) << (24-end))); } }; - template - struct parse_bitfield_i + template + struct parse_bitfield_i { - static boost::uint32_t parse(Iterator const & i) { + static boost::uint32_t parse(iterator i) { return ( parse_uint16(i+offset)>>(16-end) ) & boost::low_bits_mask_t::sig_bits; } - static void write(Iterator const & i, boost::uint32_t v) { + static void write(iterator i, boost::uint32_t v) { write_uint16(i+offset, (parse_uint16(i+offset) & ~(boost::low_bits_mask_t::sig_bits<<(16-end))) | ((v & boost::low_bits_mask_t::sig_bits) << (16-end))); } }; - template - struct parse_bitfield_i + template + struct parse_bitfield_i { - static boost::uint32_t parse(Iterator const & i) { + static boost::uint32_t parse(iterator i) { return ( i[offset]>>(8-end) ) & boost::low_bits_mask_t::sig_bits; } - static void write(Iterator const & i, boost::uint32_t v) { + static void write(iterator i, boost::uint32_t v) { i[offset] = (i[offset] & ~(boost::low_bits_mask_t::sig_bits<<(8-end))) | ((v & boost::low_bits_mask_t::sig_bits) << (8-end)); } }; - template +# endif + + /** \brief Internal: Bitfield read/write helper + + \internal + + Using template specializations, this class provides optimized bitfield parsers and + writers. For each number of bytes the bitfield covers (from 1 to 5 bytes), a template + specialization is provided in \c parse_bitfield_i. + + This helper always processes unsigned values. For signed values sign extension still needs + to be performed. + */ + template struct parse_bitfield - : public parse_bitfield_i + : public parse_bitfield_i {}; -}} +}}} ///////////////////////////////ih.e//////////////////////////////////////// #endif @@ -224,4 +270,6 @@ namespace impl { // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: