#define HH_SENF_Packets_GenericTLV_ 1
// Custom includes
+#include <boost/ptr_container/ptr_map.hpp>
#include <senf/Packets/Packets.hh>
#include <senf/Utils/type_traits.hh>
+#include <senf/Utils/singleton.hh>
//#include "GenericTLV.hh.mpp"
///////////////////////////////hh.p////////////////////////////////////////
\endcode
Your concrete TLV parsers will inherit from this base class and have to define a specific
- value field and a \c TYPEID member:
+ value field and a \c typeId member:
\code
struct MyConcreteTLVParser : public MyTLVParserBase
{
SENF_PARSER_FINALIZE ( MyConcreteTLVParser );
SENF_PARSER_INIT() {
- type() = TYPEID;
+ type() = typeId;
length_() = 4;
}
- static const type_t::value_type TYPEID = 0x42;
+ static const type_t::value_type typeId = 0x42;
};
\endcode
typedef senf::GenericTLVParserBase<MyTLVParserBase> MyGenericTLVParser;
\endcode
- This generiv tlv parser can now be used for example in a list:
+ This generic tlv parser can now be used for example in a list:
\code
class MyTestPacketParser : public senf::PacketParserBase
{
\endcode
\see
- IPv6GenericOptionTLVParser, WLANGenericInfoElementParser, MIHGenericTLVPacketParser
+ IPv6GenericOptionTLVParser, WLANGenericInfoElementParser, MIHGenericTLVParser
*/
template <class Base>
class GenericTLVParserBase : public Base
Parser init();
template <class Parser>
- Parser as();
+ Parser as() const;
template <class Parser>
- bool is();
+ bool is() const;
senf::PacketInterpreterBase::range value() const;
+ void dump(std::ostream & os) const;
+
#ifndef DOXYGEN
template<class ForwardReadableRange>
void value(ForwardReadableRange const & val,
Base & self();
Base const & self() const;
};
-}
+
+
+ namespace detail {
+ template <class BaseParser>
+ struct GenericTLVParserRegistry_EntryBase {
+ virtual void dump(GenericTLVParserBase<BaseParser> const & parser, std::ostream & os) = 0;
+ };
+
+ template <class BaseParser, class Parser>
+ struct GenericTLVParserRegistry_Entry
+ : GenericTLVParserRegistry_EntryBase<BaseParser>
+ {
+ virtual void dump(GenericTLVParserBase<BaseParser> const & parser, std::ostream & os);
+ };
+ }
+
+ template <class BaseParser>
+ class GenericTLVParserRegistry
+ : public senf::singleton<GenericTLVParserRegistry<BaseParser> >
+ {
+ typedef boost::ptr_map<
+ typename BaseParser::type_t::value_type,
+ detail::GenericTLVParserRegistry_EntryBase<BaseParser> > Map;
+ Map map_;
+
+ GenericTLVParserRegistry() {};
+ public:
+ using senf::singleton<GenericTLVParserRegistry<BaseParser> >::instance;
+ friend class senf::singleton<GenericTLVParserRegistry<BaseParser> >;
+
+ template <class PacketParser>
+ struct RegistrationProxy {
+ RegistrationProxy();
+ };
+ template <typename Parser>
+ void registerParser();
+
+ void dump(GenericTLVParserBase<BaseParser> const & parser, std::ostream & os);
+ };
+
+# define SENF_PACKET_TLV_REGISTRY_REGISTER( ConreteTLVParser ) \
+ namespace { \
+ ConreteTLVParser::Registry::RegistrationProxy<ConreteTLVParser> \
+ BOOST_PP_CAT(tlvparserRegistration_, __LINE__); \
+ }
+
+}
///////////////////////////////hh.e////////////////////////////////////////
//#include "GenericTLV.cci"