added STL-compatible predicate for GenericParsers
[senf.git] / senf / Packets / GenericTLV.hh
index e6f798a..b1298e0 100644 (file)
@@ -193,6 +193,16 @@ namespace senf {
         {
             virtual void dump(GenericTLVParserBase<BaseParser> const & parser, std::ostream & os) const;
         };
+        
+        //Helper Functor for STL-compatible predicate (E.g. find_if, for_each ...)
+        template <class BaseParser, class Parser>
+        class Predicate
+        {
+            public:
+                const bool operator() (BaseParser const &p) const{
+                    return p.template is<Parser>();
+                }
+        };
     }
     
     /** \brief TLV parser registration facility
@@ -243,19 +253,18 @@ namespace senf {
             IPv6OptionParser::Registry, WLANInfoElementParser::Registry,
             MIHBaseTLVParser::Registry 
      */
-    template <class BaseParser>
+    template <class BaseParser, class Keytype = typename BaseParser::type_t::value_type>
     class GenericTLVParserRegistry
-        : public senf::singleton<GenericTLVParserRegistry<BaseParser> >
+        : public senf::singleton<GenericTLVParserRegistry<BaseParser,Keytype> >
     {
-        typedef boost::ptr_map<
-            typename BaseParser::type_t::value_type, 
+        typedef boost::ptr_map<Keytype, 
             detail::GenericTLVParserRegistry_EntryBase<BaseParser> > Map;
         Map map_;
         
         GenericTLVParserRegistry() {};
     public:
-        using senf::singleton<GenericTLVParserRegistry<BaseParser> >::instance;
-        friend class senf::singleton<GenericTLVParserRegistry<BaseParser> >;
+        using senf::singleton<GenericTLVParserRegistry<BaseParser,Keytype> >::instance;
+        friend class senf::singleton<GenericTLVParserRegistry<BaseParser,Keytype> >;
         
         template <class PacketParser>
         struct RegistrationProxy {
@@ -265,7 +274,11 @@ namespace senf {
         template <typename Parser>
         void registerParser();
         
+        bool isRegistered(GenericTLVParserBase<BaseParser> const & parser) const;
+        bool isRegistered(Keytype const & key) const;
+        
         void dump(GenericTLVParserBase<BaseParser> const & parser, std::ostream & os) const;
+        void dump(GenericTLVParserBase<BaseParser> const & parser, Keytype const & key, std::ostream & os) const;
     };
         
     /** \brief Statically add an entry to a TLV parser registry