// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// 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
/** \file
\brief ParseHelpers public header */
-#ifndef HH_ParseHelpers_
-#define HH_ParseHelpers_ 1
+#ifndef HH_SENF_Packets_ParseHelpers_
+#define HH_SENF_Packets_ParseHelpers_ 1
-#ifndef HH_Packets_
+#ifndef HH_SENF_Packets_Packets_
#error "Don't include 'ParseHelpers.hh' directly, include 'Packets.hh'"
#endif
\par ""
\ref SENF_PARSER_FIELD(), \ref SENF_PARSER_FIELD_RO(), \ref SENF_PARSER_PRIVATE_FIELD(),
- \ref SENF_PARSER_PRIVATE_FIELD_RO(), SENF_PARSER_CUSTOM_FIELD()
+ \ref SENF_PARSER_CUSTOM_FIELD()
There are quite a few commands available to define fields. All these macros do the same thing:
they define a field accessor plus some auxiliary symbols. The accessor will use the parser type
The field defining macros come in groups which members only differ in their properties:
<dl><dt><em>Standard fields:</em><dt><dd>\ref SENF_PARSER_FIELD(), \ref SENF_PARSER_FIELD_RO(),
- \ref SENF_PARSER_PRIVATE_FIELD(), \ref SENF_PARSER_PRIVATE_FIELD_RO() define standard
- fields.</dd>
+ \ref SENF_PARSER_PRIVATE_FIELD() define standard fields.</dd>
<dt><em>Arbitrary custom field:</em><dt><dd>\ref SENF_PARSER_CUSTOM_FIELD()</dd></dl>
\par ""
\ref SENF_PARSER_BITFIELD(), \ref SENF_PARSER_BITFIELD_RO(), \ref
- SENF_PARSER_PRIVATE_BITFIELD(), \ref SENF_PARSER_PRIVATE_BITFIELD_RO() \n
+ SENF_PARSER_PRIVATE_BITFIELD()\n
Bit-fields play a special role. They are quite frequent in packet definitions but don't fit into
the byte offset based parsing infrastructure defined so far. Since defining the correctly
\ingroup packetparser
*/
-///\ingroup packetparsermacros
+///\addtogroup packetparsermacros
///\{
///\name Control information
SENF_PARSER_INHERIT(BaseParser)
\endcode
+
+ If you want to define collection fields which reference auxiliary fields in the base parser,
+ <em>you must define the base parser as a variable parser not a fixed parser</em>.
\param[in] base name of base class
\hideinitializer
<dl><dt><em>return_type</em> <em>name</em><tt>()</tt> <tt>const</tt></dt><dd>The accessor member
will return the parsed value when called. For normal fields, <em>return_type</em> equals
<em>type</em>, the type of the sub parser. This allows to change the value via the returned
- sub-parser. If the field is marked read-only (\ref SENF_PARSER_FIELD_RO() or \ref
- SENF_PARSER_PRIVATE_FIELD_RO()), the return type will be
- <em>type</em>::<tt>value_type</tt>.</dd>
+ sub-parser. If the field is marked read-only (\ref SENF_PARSER_FIELD_RO()), the return type
+ will be <em>type</em>::<tt>value_type</tt>.</dd>
<dt><tt>typedef</tt> <em>type</em> <em>name</em><tt>_t</tt></dt><dd>This typedef symbol is an
alias for the fields type.</dd>
\param[in] name field name
\param[in] type parser type
- \see \ref SENF_PARSER_FIELD_RO(), \ref SENF_PARSER_PRIVATE_FIELD(), \ref
- SENF_PARSER_PRIVATE_FIELD_RO()
+ \see \ref SENF_PARSER_FIELD_RO(), \ref SENF_PARSER_PRIVATE_FIELD()
\hideinitializer
*/
#define SENF_PARSER_FIELD(name, type)
Define read-only parser field. Read-only fields may only be defined for \a type's which are
value parsers: The parser \a type must have a \c value_type typedef member and a \c value()
member, which returns the current value of the field.
+
+ Defining such a field really defines \e two accessors: A read/write \e private field and a
+ read-only \e public accessor. The name of the private read/write field is given by adding a
+ trailing '_' to \a name. The read-only public accessor is called \a name.
\see SENF_PARSER_FIELD()
\hideinitializer
*/
#define SENF_PARSER_PRIVATE_FIELD(name, type)
-/** \brief Define parser field (private + read-only)
-
- Define a read-only parser field which is marked as \c private and may only be accessed from the
- parser class itself. Read-only fields may only be defined for \a type's which are value parsers:
- The parser \a type must have a \c value_type typedef member and a \c value() member, which
- returns the current value of the field.
-
- \see SENF_PARSER_FIELD()
- \hideinitializer
- */
-#define SENF_PARSER_PRIVATE_FIELD_RO(name, type)
-
/** \brief Define custom field accessor
This macro is used to define a field using a custom access method:
\param[in] bits number of bits
\param[in] type bit field type, one of \c signed, \c unsigned or \c bool
- \see \ref SENF_PARSER_BITFIELD_RO(), \ref SENF_PARSER_PRIVATE_BITFIELD(), \ref
- SENF_PARSER_PRIVATE_BITFIELD_RO()
-
+ \see \ref SENF_PARSER_BITFIELD_RO(), \ref SENF_PARSER_PRIVATE_BITFIELD()
\hideinitializer
*/
#define SENF_PARSER_BITFIELD(name, bits, type)
/** \brief Define bit-field (read-only)
- Define read-only bit field.
+ Define read-only bit field. This is for bit-fields what \ref SENF_PARSER_FIELD_RO is for ordinary fields.
- \see \ref SENF_PARSER_BITFIELD()
+ \see \ref SENF_PARSER_BITFIELD() \n \ref SENF_PARSER_FIELD_RO()
\hideinitializer
*/
#define SENF_PARSER_BITFIELD_RO(name, bits, type)
*/
#define SENF_PARSER_PRIVATE_BITFIELD(name, bits, type)
-/** \brief Define bit-field (private + read-only)
-
- Define a read-only bit field which is marked as \c private and may only be accessed from the
- parser class itself.
-
- \see \ref SENF_PARSER_BITFIELD()
- \hideinitializer
- */
-#define SENF_PARSER_PRIVATE_BITFIELD_RO(name, bits, type)
-
///@}
///\name Current offset
arbitrary incorrect value otherwise.
\pre Field \a name preceded by fixed size fields only
- \param[in] field or label name
+ \param[in] name field or label name
\returns compile-time constant offset of the field from parsers start
\hideinitializer
*/
This macro will return the current fixed offset, a compile-time constant expression. This is
always possible when defining a fixed size parser.
- Even in dynamically sized parsers this macro will work, up tp now only fixed size fields have
- been defined. This macro does \e not validate this condition, it will return an arbitrary
- incorrect value otherwise.
+ Even in dynamically sized parsers this macro will work, if all parser defined \e before the
+ current position are fixed-size parsers. This macro does \e not validate this condition, it will
+ return an arbitrary incorrect value otherwise.
\pre Current position preceded by fixed-size parsers only
\returns compile-time constant offset from parsers start
#else
-#define SENF_PARSER_INHERIT BOOST_PP_CAT(SENF_PARSER_INHERIT_, SENF_PARSER_TYPE)
+#define SENF_PARSER_INHERIT BOOST_PP_CAT( SENF_PARSER_INHERIT_, SENF_PARSER_TYPE )
-#define SENF_PARSER_FIELD BOOST_PP_CAT(SENF_PARSER_FIELD_, SENF_PARSER_TYPE)
-#define SENF_PARSER_FIELD_RO BOOST_PP_CAT(SENF_PARSER_FIELD_RO_, SENF_PARSER_TYPE)
-#define SENF_PARSER_BITFIELD BOOST_PP_CAT(SENF_PARSER_BITFIELD_, SENF_PARSER_TYPE)
-#define SENF_PARSER_BITFIELD_RO BOOST_PP_CAT(SENF_PARSER_BITFIELD_RO_, SENF_PARSER_TYPE)
-#define SENF_PARSER_CUSTOM_FIELD BOOST_PP_CAT(SENF_PARSER_CUSTOM_FIELD_, SENF_PARSER_TYPE)
+#define SENF_PARSER_FIELD BOOST_PP_CAT( SENF_PARSER_FIELD_, SENF_PARSER_TYPE )
+#define SENF_PARSER_FIELD_RO BOOST_PP_CAT( SENF_PARSER_FIELD_RO_, SENF_PARSER_TYPE )
+#define SENF_PARSER_BITFIELD BOOST_PP_CAT( SENF_PARSER_BITFIELD_, SENF_PARSER_TYPE )
+#define SENF_PARSER_BITFIELD_RO BOOST_PP_CAT( SENF_PARSER_BITFIELD_RO_, SENF_PARSER_TYPE )
+#define SENF_PARSER_CUSTOM_FIELD BOOST_PP_CAT( SENF_PARSER_CUSTOM_FIELD_, SENF_PARSER_TYPE )
-#define SENF_PARSER_PRIVATE_FIELD BOOST_PP_CAT(SENF_PARSER_P_FIELD_, SENF_PARSER_TYPE)
-#define SENF_PARSER_PRIVATE_FIELD_RO BOOST_PP_CAT(SENF_PARSER_P_FIELD_RO_, SENF_PARSER_TYPE)
-#define SENF_PARSER_PRIVATE_BITFIELD BOOST_PP_CAT(SENF_PARSER_P_BITFIELD_, SENF_PARSER_TYPE)
-#define SENF_PARSER_PRIVATE_BITFIELD_RO BOOST_PP_CAT(SENF_PARSER_P_BITFIELD_RO_, SENF_PARSER_TYPE)
+#define SENF_PARSER_PRIVATE_FIELD BOOST_PP_CAT( SENF_PARSER_P_FIELD_, SENF_PARSER_TYPE )
+#define SENF_PARSER_PRIVATE_BITFIELD BOOST_PP_CAT( SENF_PARSER_P_BITFIELD_, SENF_PARSER_TYPE )
-#define SENF_PARSER_SKIP BOOST_PP_CAT(SENF_PARSER_SKIP_, SENF_PARSER_TYPE)
-#define SENF_PARSER_SKIP_BITS BOOST_PP_CAT(SENF_PARSER_SKIP_BITS_, SENF_PARSER_TYPE)
-#define SENF_PARSER_GOTO BOOST_PP_CAT(SENF_PARSER_GOTO_, SENF_PARSER_TYPE)
-#define SENF_PARSER_GOTO_OFFSET BOOST_PP_CAT(SENF_PARSER_GOTO_OFFSET_, SENF_PARSER_TYPE)
-#define SENF_PARSER_LABEL BOOST_PP_CAT(SENF_PARSER_LABEL_, SENF_PARSER_TYPE)
+#define SENF_PARSER_SKIP BOOST_PP_CAT( SENF_PARSER_SKIP_, SENF_PARSER_TYPE )
+#define SENF_PARSER_SKIP_BITS BOOST_PP_CAT( SENF_PARSER_SKIP_BITS_, SENF_PARSER_TYPE )
+#define SENF_PARSER_GOTO BOOST_PP_CAT( SENF_PARSER_GOTO_, SENF_PARSER_TYPE )
+#define SENF_PARSER_GOTO_OFFSET BOOST_PP_CAT( SENF_PARSER_GOTO_OFFSET_, SENF_PARSER_TYPE )
+#define SENF_PARSER_LABEL BOOST_PP_CAT( SENF_PARSER_LABEL_, SENF_PARSER_TYPE )
-#define SENF_PARSER_OFFSET BOOST_PP_CAT(SENF_PARSER_OFFSET_, SENF_PARSER_TYPE)
-#define SENF_PARSER_FIXED_OFFSET BOOST_PP_CAT(SENF_PARSER_FIXED_OFFSET_,SENF_PARSER_TYPE)
-#define SENF_PARSER_CURRENT_FIXED_OFFSET BOOST_PP_CAT(SENF_PARSER_CURRENT_FIXED_OFFSET_, SENF_PARSER_TYPE)
+#define SENF_PARSER_OFFSET BOOST_PP_CAT( SENF_PARSER_OFFSET_, SENF_PARSER_TYPE )
+#define SENF_PARSER_FIXED_OFFSET BOOST_PP_CAT( SENF_PARSER_FIXED_OFFSET_, SENF_PARSER_TYPE )
+#define SENF_PARSER_CURRENT_FIXED_OFFSET BOOST_PP_CAT( SENF_PARSER_CURRENT_FIXED_OFFSET_, SENF_PARSER_TYPE )
-#define SENF_PARSER_FINALIZE BOOST_PP_CAT(SENF_PARSER_FINALIZE_, SENF_PARSER_TYPE)
+#define SENF_PARSER_FINALIZE BOOST_PP_CAT( SENF_PARSER_FINALIZE_, SENF_PARSER_TYPE )
#endif
///////////////////////////////hh.e////////////////////////////////////////
#endif
-#if !defined(HH_Packets__decls_) && !defined(HH_ParseHelpers_i_)
-#define HH_ParseHelpers_i_
+#if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_ParseHelpers_i_)
+#define HH_SENF_Packets_ParseHelpers_i_
//#include "ParseHelpers.cci"
//#include "ParseHelpers.ct"
//#include "ParseHelpers.cti"