NEW FILE HEADER / COPYRIGHT FORMAT
[senf.git] / Packets / ParseHelpers.ih
index b55c9a4..7b3b5ea 100644 (file)
@@ -1,6 +1,6 @@
 # // Copyright (C) 2007
-# // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-# // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+# // Fraunhofer Institute for Open Communication Systems (FOKUS) 
+# // Competence Center NETwork research (NET), St. Augustin, GERMANY 
 # //     Stefan Bund <g0dil@berlios.de>
 # //
 # // This program is free software; you can redistribute it and/or modify
@@ -41,7 +41,7 @@
         SENF_MPL_SLOT_DEF_ZERO(offset);                                                           \
         SENF_MPL_SLOT_DEF_ZERO(bit);                                                              \
         SENF_MPL_SLOT_DEF_ZERO(bitfield_size);                                                    \
-        void init_chain(senf::mpl::rv<0>*) {}                                                     \
+        void init_chain(senf::mpl::rv<0>*) const {}                                               \
     public:
 #
 # define SENF_PARSER_INITIALIZE_var()                                                             \
@@ -50,7 +50,7 @@
         SENF_MPL_SLOT_DEF_ZERO(init_bytes);                                                       \
         SENF_MPL_SLOT_DEF_ZERO(bit);                                                              \
         SENF_MPL_SLOT_DEF_ZERO(bitfield_size);                                                    \
-        void init_chain(senf::mpl::rv<0>*) {}                                                     \
+        void init_chain(senf::mpl::rv<0>*) const {}                                               \
         size_type field_offset_(senf::mpl::rv<0>*) const { return 0; }                            \
     public:
 #
@@ -65,7 +65,7 @@
         size_type field_offset_(senf::mpl::rv<1>*) const {                                        \
             return senf::bytes( *static_cast<name const*>(this) );                                \
         }                                                                                         \
-        void init_chain(senf::mpl::rv<1>*) {                                                      \
+        void init_chain(senf::mpl::rv<1>*) const {                                                \
             name::init();                                                                         \
         }                                                                                         \
     public:
@@ -75,7 +75,7 @@
     private:                                                                                      \
         SENF_MPL_SLOT_SET(offset, name::fixed_bytes);                                             \
         SENF_MPL_SLOT_SET(index, 1);                                                              \
-        void init_chain(senf::mpl::rv<1>*) {                                                      \
+        void init_chain(senf::mpl::rv<1>*) const {                                                \
             name::init();                                                                         \
         }                                                                                         \
     public:
 #
 # define SENF_PARSER_I_FIELD_INIT_rw(name, type, access)                                                  \
     private:                                                                                      \
-        void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) {                              \
+        void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) const {                        \
             init_chain(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0));              \
             name().init();                                                                        \
         }                                                                                         \
 #
 # define SENF_PARSER_I_FIELD_INIT_ro(name, type, access)                                                  \
     private:                                                                                      \
-        void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) {                              \
+        void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) const {                        \
             init_chain(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0));              \
         }                                                                                         \
     access:
 # define SENF_PARSER_I_FIELD_OFS_var(name, type, access)                                          \
         size_type BOOST_PP_CAT(name,_offset)() const {                                            \
             return field_offset_(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0));    \
-        }
+        }                                                                                         \
+        static size_type const BOOST_PP_CAT(name, _init_bytes) = SENF_MPL_SLOT_GET(init_bytes);
 #
 # define SENF_PARSER_I_FIELD_OFS_fix(name, type, access)                                          \
         static size_type const BOOST_PP_CAT(name, _offset) = SENF_MPL_SLOT_GET(offset);
         size_type BOOST_PP_CAT(name, _next_offset)() const {                                      \
             return BOOST_PP_CAT(name,_offset)() + size;                                           \
         }                                                                                         \
-        static size_type const BOOST_PP_CAT(name, _init_bytes) = SENF_MPL_SLOT_GET(init_bytes);   \
         static size_type const BOOST_PP_CAT(name, _next_init_bytes) =                             \
             BOOST_PP_CAT(name, _init_bytes) + isize;                                              \
     private:                                                                                      \
 # // SENF_PARSER_BITFIELD_*
 # // SENF_PARSER_P_BITFIELD_*
 #
-# define SENF_PARSER_BITFIELD_var(name, bits, type)                                                \
+# define SENF_PARSER_BITFIELD_var(name, bits, type)                                               \
       SENF_PARSER_BITFIELD_I(name, bits, type, var, rw, public)
-# define SENF_PARSER_BITFIELD_RO_var(name, bits, type)                                             \
+# define SENF_PARSER_BITFIELD_RO_var(name, bits, type)                                            \
       SENF_PARSER_BITFIELD_I(name, bits, type, var, ro, public)
-# define SENF_PARSER_BITFIELD_fix(name, bits, type)                                                \
+# define SENF_PARSER_BITFIELD_fix(name, bits, type)                                               \
       SENF_PARSER_BITFIELD_I(name, bits, type, fix, rw, public)
-# define SENF_PARSER_BITFIELD_RO_fix(name, bits, type)                                             \
+# define SENF_PARSER_BITFIELD_RO_fix(name, bits, type)                                            \
       SENF_PARSER_BITFIELD_I(name, bits, type, fix, ro, public)
 #
-# define SENF_PARSER_P_BITFIELD_var(name, bits, type)                                              \
+# define SENF_PARSER_P_BITFIELD_var(name, bits, type)                                             \
       SENF_PARSER_BITFIELD_I(name, bits, type, var, rw, private)
-# define SENF_PARSER_P_BITFIELD_RO_var(name, bits, type)                                           \
+# define SENF_PARSER_P_BITFIELD_RO_var(name, bits, type)                                          \
       SENF_PARSER_BITFIELD_I(name, bits, type, var, ro, private)
-# define SENF_PARSER_P_BITFIELD_fix(name, bits, type)                                              \
+# define SENF_PARSER_P_BITFIELD_fix(name, bits, type)                                             \
       SENF_PARSER_BITFIELD_I(name, bits, type, fix, rw, private)
-# define SENF_PARSER_P_BITFIELD_RO_fix(name, bits, type)                                           \
+# define SENF_PARSER_P_BITFIELD_RO_fix(name, bits, type)                                          \
       SENF_PARSER_BITFIELD_I(name, bits, type, fix, ro, private)
 #
 # ////////////////////////////////////////
 # // SENF_PARSER_BITFIELD_I
 #
-# define SENF_PARSER_BITFIELD_TYPE_signed(start, bits)   senf::Parse_IntField<start, start+bits>
-# define SENF_PARSER_BITFIELD_TYPE_unsigned(start, bits) senf::Parse_UIntField<start, start+bits>
-# define SENF_PARSER_BITFIELD_TYPE_bool(start, bits)     senf::Parse_Flag<start>
+# define SENF_PARSER_BITFIELD_TYPE_signed(start, bits)   senf::IntFieldParser<start, start+bits>
+# define SENF_PARSER_BITFIELD_TYPE_unsigned(start, bits) senf::UIntFieldParser<start, start+bits>
+# define SENF_PARSER_BITFIELD_TYPE_bool(start, bits)     senf::FlagParser<start>
 #
 # define SENF_PARSER_BITFIELD_I(name, bits, type, ofstype, rwtype, access)                        \
     access:                                                                                       \
         size_type BOOST_PP_CAT(name,_offset)() const {                                            \
             return field_offset_(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0))     \
                 - SENF_MPL_SLOT_GET(bitfield_size);                                               \
-        }
+        }                                                                                         \
+        static size_type const BOOST_PP_CAT(name, _init_bytes) = SENF_MPL_SLOT_GET(init_bytes)    \
+            - SENF_MPL_SLOT_GET(bitfield_size);
 #
 # define SENF_PARSER_I_BITFIELD_OFS_fix(name, type, access)                                       \
         static size_type const BOOST_PP_CAT(name, _offset) = SENF_MPL_SLOT_GET(offset)            \
           SENF_PARSER_I_BITFIELD_RESET()                                                          \
           SENF_PARSER_I_FIELD_INTRO(name, void, private)                                          \
           SENF_PARSER_I_FIELD_INIT_ro(name, void, private)                                        \
-          BOOST_PP_CAT( SENF_PARSER_I_GOTO_SET_OFS_, ofstype ) (name, offset, initsize)            \
+          BOOST_PP_CAT( SENF_PARSER_I_GOTO_SET_OFS_, ofstype ) (name, offset, initsize)           \
       public:
 #
-# define SENF_PARSER_I_GOTO_SET_OFS_var(name, offs, initsize)                                      \
+# define SENF_PARSER_I_GOTO_SET_OFS_var(name, offs, initsize)                                     \
           size_type field_offset_(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) const {              \
               return offs;                                                                        \
           }                                                                                       \
           SENF_MPL_SLOT_SET(init_bytes, initsize);
 #
-# define SENF_PARSER_I_GOTO_SET_OFS_fix(name, offs, initsize)                                      \
+# define SENF_PARSER_I_GOTO_SET_OFS_fix(name, offs, initsize)                                     \
           SENF_MPL_SLOT_SET(offset, offs);
 #
 # ///////////////////////////////////////////////////////////////////////////
     static size_type const fixed_bytes = SENF_MPL_SLOT_GET(offset);
 #
 # define SENF_PARSER_FINALIZE_GENERIC(name)                                                       \
-         void defaultInit() {                                                                     \
+         void defaultInit() const {                                                               \
              init_chain(static_cast<senf::mpl::rv<SENF_MPL_SLOT_GET(index)>*>(0));                \
          }                                                                                        \
          name(data_iterator i, state_type s) : parser_base_type(i,s) {}                           \
     private:                                                                                      \
-         template <class T> void init(T) { defaultInit(); }                                       \
+         template <class T> void init(T) const { defaultInit(); }                                 \
     public:                                                                                       \
-         void init() { init(0); }
+         void init() const { init(0); }
 #
 # ////////////////////////////////ih.e///////////////////////////////////////
 # endif