moved Sniffer into new Examples directory
[senf.git] / Packets / ParseInt.hh
index ba13aaf..0d4f4f3 100644 (file)
@@ -1,6 +1,6 @@
 // $Id$
 //
-// Copyright (C) 2006 
+// Copyright (C) 2006
 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
@@ -24,6 +24,7 @@
 #define HH_ParseInt_ 1
 
 // Custom includes
+#include <iostream>
 #include "ParserBase.hh"
 #include <boost/cstdint.hpp>
 #include <boost/static_assert.hpp>
@@ -38,9 +39,9 @@ namespace senf {
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_Int8
-       : public impl::ParseIntOps<Parse_Int8<Iterator,IPacket>,boost::int8_t>,
+        : public impl::ParseIntOps<Parse_Int8<Iterator,IPacket>,boost::int8_t>,
           public ParserBase<Iterator,IPacket>
-    { 
+    {
         template <class I=nil, class P=nil>
         struct rebind { typedef Parse_Int8<I,P> parser; };
         typedef Iterator byte_iterator;
@@ -58,10 +59,13 @@ namespace senf {
         void value(value_type v) { this->i()[0] = v; }
         Parse_Int8 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_Int8<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_UInt8
-       : public impl::ParseIntOps<Parse_UInt8<Iterator,IPacket>,boost::uint8_t>,
+        : public impl::ParseIntOps<Parse_UInt8<Iterator,IPacket>,boost::uint8_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -69,7 +73,7 @@ namespace senf {
         typedef Iterator byte_iterator;
 
         static unsigned bytes() { return 1; }
-        
+
         Parse_UInt8() {}
         explicit Parse_UInt8(Iterator const & i) : ParserBase<Iterator,IPacket>(i) {}
 
@@ -81,10 +85,13 @@ namespace senf {
         void value(value_type v) { this->i()[0] = v; }
         Parse_UInt8 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_UInt8<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_Int16
-       : public impl::ParseIntOps<Parse_Int16<Iterator,IPacket>,boost::int16_t>,
+        : public impl::ParseIntOps<Parse_Int16<Iterator,IPacket>,boost::int16_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -104,10 +111,13 @@ namespace senf {
         void value(value_type v) { impl::write_uint16(this->i(),v); }
         Parse_Int16 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_Int16<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_UInt16
-       : public impl::ParseIntOps<Parse_UInt16<Iterator,IPacket>,boost::uint16_t>,
+        : public impl::ParseIntOps<Parse_UInt16<Iterator,IPacket>,boost::uint16_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -127,10 +137,13 @@ namespace senf {
         void value(value_type v) { impl::write_uint16(this->i(),v); }
         Parse_UInt16 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_UInt16<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_Int24
-       : public impl::ParseIntOps<Parse_Int24<Iterator,IPacket>,boost::int32_t>,
+        : public impl::ParseIntOps<Parse_Int24<Iterator,IPacket>,boost::int32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -146,15 +159,18 @@ namespace senf {
 
         typedef boost::int32_t value_type;
 
-        value_type value() const { 
+        value_type value() const {
             value_type v (impl::parse_uint24(this->i())); return v&0x800000 ? v|0xff000000 : v; }
         void value(value_type v) { impl::write_uint24(this->i(),v); }
         Parse_Int24 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_Int24<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_UInt24
-       : public impl::ParseIntOps<Parse_UInt24<Iterator,IPacket>,boost::uint32_t>,
+        : public impl::ParseIntOps<Parse_UInt24<Iterator,IPacket>,boost::uint32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -174,10 +190,13 @@ namespace senf {
         void value(value_type v) { impl::write_uint24(this->i(),v); }
         Parse_UInt24 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_UInt24<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_Int32
-       : public impl::ParseIntOps<Parse_Int32<Iterator,IPacket>,boost::int32_t>,
+        : public impl::ParseIntOps<Parse_Int32<Iterator,IPacket>,boost::int32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -197,10 +216,13 @@ namespace senf {
         void value(value_type v) { impl::write_uint32(this->i(),v); }
         Parse_Int32 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_Int32<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <class Iterator=nil, class IPacket=nil>
     struct Parse_UInt32
-       : public impl::ParseIntOps<Parse_UInt32<Iterator,IPacket>,boost::uint32_t>,
+        : public impl::ParseIntOps<Parse_UInt32<Iterator,IPacket>,boost::uint32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -220,10 +242,13 @@ namespace senf {
         void value(value_type v) { impl::write_uint32(this->i(),v); }
         Parse_UInt32 const & operator= (value_type other) { value(other); return *this; }
     };
+    template <class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_UInt32<Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <unsigned start, unsigned end, class Iterator=nil, class IPacket=nil>
     struct Parse_IntField
-       : public impl::ParseIntOps<Parse_IntField<start,end,Iterator,IPacket>,boost::int32_t>,
+        : public impl::ParseIntOps<Parse_IntField<start,end,Iterator,IPacket>,boost::int32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -239,7 +264,7 @@ namespace senf {
 
         typedef boost::int32_t value_type;
 
-        value_type value() const { 
+        value_type value() const {
             value_type v (impl::parse_bitfield<Iterator,start,end>::parse(this->i()));
             return v&boost::high_bit_mask_t<end-start-1>::high_bit ?
                 v | ~boost::low_bits_mask_t<end-start>::sig_bits : v;
@@ -251,10 +276,13 @@ namespace senf {
         BOOST_STATIC_ASSERT( start<end );
         BOOST_STATIC_ASSERT( end-start<=32 );
     };
+    template <unsigned start, unsigned end, class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_IntField<start,end,Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <unsigned start, unsigned end, class Iterator=nil, class IPacket=nil>
     struct Parse_UIntField
-       : public impl::ParseIntOps<Parse_UIntField<start,end,Iterator,IPacket>,boost::uint32_t>,
+        : public impl::ParseIntOps<Parse_UIntField<start,end,Iterator,IPacket>,boost::uint32_t>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -278,10 +306,13 @@ namespace senf {
         BOOST_STATIC_ASSERT( start<end );
         BOOST_STATIC_ASSERT( end-start<=32 );
     };
+    template <unsigned start, unsigned end, class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_UIntField<start,end,Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
     template <unsigned bit, class Iterator=nil, class IPacket=nil>
     struct Parse_Flag
-       : public impl::ParseIntOps<Parse_Flag<bit,Iterator,IPacket>,bool>,
+        : public impl::ParseIntOps<Parse_Flag<bit,Iterator,IPacket>,bool>,
           public ParserBase<Iterator,IPacket>
     {
         template <class I=nil, class P=nil>
@@ -298,12 +329,15 @@ namespace senf {
         typedef bool value_type;
 
         value_type value() const { return this->i()[bit/8] & (1<<(7-(bit%8))); }
-        void value(value_type v) { 
+        void value(value_type v) {
             if (v) this->i()[0] |= 1<<(7-(bit%8));
             else   this->i()[0] &= ~(1<<(7-(bit%8)));
         }
         Parse_Flag const & operator= (value_type other) { value(other); return *this; }
     };
+    template <unsigned bit, class Iterator, class IPacket>
+    std::ostream & operator<<(std::ostream & os, Parse_Flag<bit,Iterator,IPacket> const & i)
+    { os << i.value(); return os; }
 
 }
 
@@ -316,5 +350,8 @@ namespace senf {
 \f
 // Local Variables:
 // mode: c++
+// fill-column: 100
 // c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
 // End: