From 5aa40cebd94f0e242b24fee5ad981c89776cca81 Mon Sep 17 00:00:00 2001 From: tho <tho@wiback.org> Date: Mon, 10 Nov 2008 11:56:57 +0000 Subject: [PATCH] added (U)Int64Parser --- Packets/IntParser.hh | 62 ++++++++++++++++++++++++++++++++++++++++---- Packets/IntParser.ih | 30 ++++++++++++++++++++- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/Packets/IntParser.hh b/Packets/IntParser.hh index fe3de0379..eb51170b6 100644 --- a/Packets/IntParser.hh +++ b/Packets/IntParser.hh @@ -284,8 +284,60 @@ namespace senf { inline std::ostream & operator<<(std::ostream & os, UInt32Parser const & i) { os << i.value(); return os; } + /** \brief Parse 64bit signed byte aligned integer + \see parseint + \ingroup parseint + */ + struct Int64Parser + : public detail::packet::IntParserOps<Int64Parser,boost::int64_t>, + public PacketParserBase + { + Int64Parser(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + + /////////////////////////////////////////////////////////////////////////// + + typedef boost::int64_t value_type; + static size_type const fixed_bytes = 8; + + value_type value() const { return detail::packet::parse_uint64(i()); } + void value(value_type v) { detail::packet::write_uint64(i(),v); } + Int64Parser const & operator= (value_type other) { value(other); return *this; } + }; + /** \brief Write parsed value to stream + \related Int64Parser + */ + inline std::ostream & operator<<(std::ostream & os, Int64Parser const & i) + { os << i.value(); return os; } + + + /** \brief Parse 64bit unsigned byte aligned integer + \see parseint + \ingroup parseint + */ + struct UInt64Parser + : public detail::packet::IntParserOps<UInt64Parser,boost::uint64_t>, + public PacketParserBase + { + UInt64Parser(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + + /////////////////////////////////////////////////////////////////////////// + + typedef boost::uint64_t value_type; + static size_type const fixed_bytes = 8; + + value_type value() const { return detail::packet::parse_uint64(i()); } + void value(value_type v) { detail::packet::write_uint64(i(),v); } + UInt64Parser const & operator= (value_type other) { value(other); return *this; } + }; + /** \brief Write parsed value to stream + \related UInt64Parser + */ + inline std::ostream & operator<<(std::ostream & os, UInt64Parser const & i) + { os << i.value(); return os; } + + /** \brief Parse signed bitfield with up to 32bit's - + This parser will parse a bitfield beginning at the bit \a Start and ending \e before \a End. Bits are numbered <em>most significant bit first</em> as this is the customary numbering used when defining packet data structures. \a Start and \a End can be \e @@ -303,7 +355,7 @@ namespace senf { compile-time constants, the compiler will create optimized bit-masks to directly access the value. The parser is also optimized to access the minimum number of data bytes necessary. - + \ingroup parseint */ template <unsigned Start, unsigned End> @@ -343,7 +395,7 @@ namespace senf { { os << i.value(); return os; } /** \brief Parse unsigned bitfield with up to 32bit's - + This parser will parse a bitfield beginning at the bit \a Start and ending \e before \a End. Bits are numbered <em>most significant bit first</em> as this is the customary numbering used when defining packet data structures. \a Start and \a End can be \e @@ -361,7 +413,7 @@ namespace senf { compile-time constants, the compiler will create optimized bit-masks to directly access the value. The parser is also optimized to access the minimum number of data bytes necessary. - + \ingroup parseint */ template <unsigned Start, unsigned End> @@ -449,7 +501,7 @@ namespace senf { //#include "IntParser.cti" #endif - + // Local Variables: // mode: c++ // fill-column: 100 diff --git a/Packets/IntParser.ih b/Packets/IntParser.ih index 9ad8a1dc8..fdc7b8563 100644 --- a/Packets/IntParser.ih +++ b/Packets/IntParser.ih @@ -155,6 +155,34 @@ namespace packet { i[3] = ( v ) & 0xff; } + /** \brief Internal: Extract 64bit network byte order value + + \internal + */ + inline boost::uint64_t parse_uint64(iterator i) + { + return ((boost::uint64_t)i[7]) | ((boost::uint64_t)i[6])<<8 + | ((boost::uint64_t)i[5])<<16 | ((boost::uint64_t)i[4])<<24 + | ((boost::uint64_t)i[3])<<32 | ((boost::uint64_t)i[2])<<40 + | ((boost::uint64_t)i[1])<<48 | ((boost::uint64_t)i[0])<<56; + } + + /** \brief Internal: Write 64bit network byte order value + + \internal + */ + inline void write_uint64(iterator i, boost::uint64_t v) + { + i[0] = ( v >> 56 ) & 0xff; + i[1] = ( v >> 48 ) & 0xff; + i[2] = ( v >> 40 ) & 0xff; + i[3] = ( v >> 32 ) & 0xff; + i[4] = ( v >> 24 ) & 0xff; + i[5] = ( v >> 16 ) & 0xff; + i[6] = ( v >> 8 ) & 0xff; + i[7] = ( v ) & 0xff; + } + /////////////////////////////////////////////////////////////////////////// // bitfield extraction @@ -263,7 +291,7 @@ namespace packet { ///////////////////////////////ih.e//////////////////////////////////////// #endif - + // Local Variables: // mode: c++ // fill-column: 100 -- GitLab