template <class Policy> friend class Parse_List_Container;
};
- /** \brief Example of a list policy. ONLY FOR EXPOSITION.
-
- This class shows the interface which must be implemented by a list policy. It is not a list
- policy only a declaration of the interface:
- \code
- struct ExampleListPolicy
- {
- // optional typedefs used to simplify all other declarations
- typedef PacketParserBase::data_iterator data_iterator;
- typedef PacketParserBase::state_type state_type;
- typedef PacketParserBase::size_type size_type;
-
- // mandatory typedefs in the parser and container policy
- typedef ElementParser element_type;
- typedef Parse_List< ExampleListPolicy > parser_type;
- typedef Parse_List_Container< ExampleListPolicy > container_type;
-
- // mandatory constant in parser and container policy
- static const size_type init_bytes = 0;
-
- // Members needed in the parser and the container policy
- size_type bytes (data_iterator i, state_type s) const;
- size_type size (data_iterator i, state_type s) const;
- void init (data_iterator i, state_type s) const;
-
- // Members needed only in the container policy
- void erase (data_iterator i, state_type s, iterator p) const;
- void insert (data_iterator i, state_type s, iterator p) const;
-
- struct iterator_policy
- {
- iterator setBegin (data_iterator i, state_type s);
- iterator setEnd (data_iterator i, state_type s);
- void setFromPosition (data_iterator i, state_type s, iterator p);
- iterator next (data_iterator i, state_type s);
- iterator raw (data_iterator i, state_type s) const;
- };
- };
- \endcode
-
- If necessary, you may use a different policy in the container_type. The ListPolicy must
- define the elements bytes(), size() and init(), the container policy needs all these and
- additionally needs erase() and insert(). The container policy will also need the
- element_type, parser_type and container_type typedefs.
-
- \see \ref Parse_List
- */
- struct ExampleListPolicy
- {
- typedef PacketParserBase::data_iterator iterator;
- typedef PacketParserBase::state_type state_type;
- typedef PacketParserBase::size_type size_type;
-
- typedef void element_type; ///< Type of list elements
- /**< This is the parser used to parse the list elements. */
- typedef void parser_type; ///< List parser type
- /**< parser_type is the list parser used to parse a list of
- this type,
- e.g. <tt>senf::Parse_List<ExampleListPolicy></tt>. */
- typedef void container_type; ///< Type of container wrapper
- /**< This is the container wrapper of the list, e.g.
- <tt>Parse_List_Container<ExampleListPolicy></tt>. The
- container may however use a \e different policy, as
- long as that policy is constructible from the parser
- policy. */
-
- static const size_type init_bytes = 0; ///< Size of a new list of this type
- /**< Initial size which needs to be allocated to this type
- of list */
-
- size_type bytes(iterator i, state_type s) const; ///< Size of list in bytes
- /**< Return the complete size of the list in
- bytes. Depending on the type of list, this call may
- need to completely traverse the list ... */
-
- size_type size(iterator i, state_type s) const; ///< Number of elements in list
- /**< Return the number of elements in the list. This
- operation may be quite inefficient for some lists (the
- list must be traversed to find that number. */
-
- void init(iterator i, state_type s) const; ///< Initialize new list
- /**< Called after init_size bytes have been allocated to
- initialize the list. After init() is called, the list
- is traversed to initialize any members (probably
- none) */
-
- void erase(iterator i, state_type s, iterator p) const; ///< Erase element from list
- /**< Delete the list element at p from the List (i,s). When
- this operation is called, the element is still part of
- the list. This call must update the meta-data as
- needed. The data will be removed after this call
- returns. */
-
- void insert(iterator i, state_type s, iterator p) const; ///< Insert element into list
- /**< This is called after an element has been inserted at p
- into the List (i,s) to update the meta-data. */
-
- /** \brief Example of a list iterator policy. ONLY FOR EXPOSITION.
-
- \see \ref ExampleListPolicy \n
- \ref Parse_List
- */
- struct iterator_policy
- {
- iterator setBegin(iterator i, state_type s); ///< Initialize iterator to begin()
- /**< Initialize the policy from the given List (i,s). Set
- the iterator to the beginning iterator. Return
- data_iterator to the first element.
-
- \warning if the list is empty, the returned iterator
- \e must be the same as the one returned by setEnd. */
-
- iterator setEnd(iterator i, state_type s); ///< Initialize iterator to end()
- /**< Initialize the policy from the given List (i,s). Set
- the iterator to the end iterator. Return data_iterator
- used to mark the end of the range. This may be a
- special sentinel value (e.g. data().end()) if
- needed. */
-
- void setFromPosition(iterator i, state_type s, iterator p);
- ///< Initialize iterator from the given raw position
- /**< Set the iterator to the Element at raw position p. This
- operation can potentially be very inefficient if the
- list needs to be traversed from the beginning until the
- iterator is found. */
-
- iterator next(iterator i, state_type s); ///< Advance to next element
- /**< given an iterator to an element, go to the next
- element. */
-
- iterator raw(iterator i, state_type s); ///< Return raw position of element
- /**< Given the iterator state (i,s), return the raw iterator
- to the datum. This will be i in almost all cases EXCEPT
- if a special sentinel value is used as end() value. In
- this case, this member must return the real position
- after the last element. */
- };
-
- /** \brief Example of a list container policy. ONLY FOR EXPOSITION
-
- \see \ref ExampleListPolicy \n
- \ref Parse_List
- */
- struct container_policy
- {
- void init(iterator i, state_type s); ///< Initialize new container
- void update(iterator i, state_type s); ///< Called before every container access
- };
- };
-
/** \brief Parse_List container wrapper
This is the container wrapper used for list parsers. The container wrapper will stay valid
///////////////////////////////hh.e////////////////////////////////////////
#endif
-#if !defined(SENF_PACKETS_DECL_ONLY) && !defined(HH_ParseList_i_)
+#if !defined(HH_Packets__decls_) && !defined(HH_ParseList_i_)
#define HH_ParseList_i_
//#include "ParseList.cci"
#include "ParseList.ct"