added (U)Int64Parser
tho [Mon, 10 Nov 2008 11:56:57 +0000 (11:56 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@950 270642c3-0616-0410-b53a-bc976706d245

Packets/IntParser.hh
Packets/IntParser.ih

index fe3de03..eb51170 100644 (file)
@@ -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
 
-\f
+
 // Local Variables:
 // mode: c++
 // fill-column: 100
index 9ad8a1d..fdc7b85 100644 (file)
@@ -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
 
-\f
+
 // Local Variables:
 // mode: c++
 // fill-column: 100