/** \file
\brief AuxParser public header */
-#ifndef HH_AuxParser_
-#define HH_AuxParser_ 1
+#ifndef HH_SENF_Packets_AuxParser_
+#define HH_SENF_Packets_AuxParser_ 1
-#ifndef HH_Packets_
+#ifndef HH_SENF_Packets_Packets_
#error "Don't include 'AuxParser.hh' directly, include 'Packets.hh'"
#endif
namespace senf {
namespace detail {
+ /** \brief Internal: Prefix aux-parser policy
+
+ Place auxiliary field directly before a container/collection.
+ */
template <class P>
struct PrefixAuxParserPolicy
{
typedef PrefixAuxParserPolicy WrapperPolicy;
- typedef P ParserType;
+ typedef PrefixAuxParserPolicy ParserPolicy;
- static PacketParserBase::size_type const aux_bytes = ParserType::fixed_bytes;
+ static PacketParserBase::size_type const aux_bytes = P::fixed_bytes;
- ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
};
+ /** \brief Internal: Fixed distance aux-parser policy
+
+ Place auxiliary field a fixed distance before the container/collection
+ */
template <class P, unsigned Dist>
struct FixedAuxParserPolicy
{
typedef FixedAuxParserPolicy WrapperPolicy;
- typedef P ParserType;
+ typedef FixedAuxParserPolicy ParserPolicy;
static PacketParserBase::size_type const aux_bytes = 0;
- ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
};
template <class P> struct DynamicWrapperAuxParserPolicy;
+ /** \brief Internal: Dynamic aux-parser policy
+
+ Place auxiliary field at a variable distance before the container/collection
+ */
template <class P>
struct DynamicAuxParserPolicy
{
typedef DynamicWrapperAuxParserPolicy<P> WrapperPolicy;
- typedef P ParserType;
+ typedef DynamicAuxParserPolicy<P> ParserPolicy;
static PacketParserBase::size_type const aux_bytes = 0;
- DynamicAuxParserPolicy(ParserType p);
+ DynamicAuxParserPolicy(P p);
DynamicAuxParserPolicy(WrapperPolicy const & other);
- ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
- ParserType p_;
+ mutable P p_;
};
+ /** \brief Internal: Dynamic aux-parser policy (container wrapper)
+
+ Place auxiliary field at a variable distance before the container/collection. This is the
+ wrapper policy used by DynamicAuxParserPolicy
+ */
template <class P>
struct DynamicWrapperAuxParserPolicy
{
+ typedef DynamicWrapperAuxParserPolicy<P> WrapperPolicy;
typedef DynamicAuxParserPolicy<P> ParserPolicy;
- typedef P ParserType;
static PacketParserBase::size_type const aux_bytes = 0;
DynamicWrapperAuxParserPolicy(ParserPolicy const & other);
- ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
- SafePacketParserWrapper<ParserType> p_;
+ mutable SafePacketParserWrapper<P> p_;
+ };
+
+ /** \brief Internal: Apply transformation to arbitrary aux-parser policy
+
+ Transform must statisfy the interface
+ \code
+ struct Transform
+ {
+ typedef unspecified value_type;
+ static value_type get(unspecified v);
+ static unspecified set(value_type v);
+ };
+ \endcode
+ */
+ template <class Policy, class Transform>
+ struct TransformAuxParserPolicy
+ : public Policy
+ {
+ typedef TransformAuxParserPolicy<typename Policy::WrapperPolicy, Transform> WrapperPolicy;
+ typedef TransformAuxParserPolicy<typename Policy::ParserPolicy, Transform> ParserPolicy;
+
+ static PacketParserBase::size_type const aux_bytes = Policy::aux_bytes;
+
+ TransformAuxParserPolicy();
+ template <class Arg> TransformAuxParserPolicy(Arg const & arg);
+
+ typename Transform::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
+ void aux(typename Transform::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
};
}}
///////////////////////////////hh.e////////////////////////////////////////
#endif
-#if !defined(HH_Packets__decls_) && !defined(HH_AuxParser_i_)
-#define HH_AuxParser_i_
+#if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_AuxParser_i_)
+#define HH_SENF_Packets_AuxParser_i_
//#include "AuxParser.cci"
//#include "AuxParser.ct"
#include "AuxParser.cti"