Packets: Fix VariantParser invalid parser access bug
[senf.git] / Packets / ListParser.ih
index e6c7d30..0be4b02 100644 (file)
@@ -23,8 +23,8 @@
 /** \file
     \brief ListParser internal header */
 
-#ifndef IH_ListParser_
-#define IH_ListParser_ 1
+#ifndef IH_SENF_Packets_ListParser_
+#define IH_SENF_Packets_ListParser_ 1
 
 // Custom includes
 #include <boost/iterator/iterator_facade.hpp>
@@ -38,39 +38,63 @@ namespace detail {
 
         \internal
      */
-    template <class ElementParser, class IteratorPolicy>
+    template <class Container>
     class ListParser_Iterator
-        : public boost::iterator_facade< ListParser_Iterator<ElementParser,IteratorPolicy>,
-                                         ElementParser,
+        : public boost::iterator_facade< ListParser_Iterator<Container>,
+                                         typename Container::value_type,
                                          boost::forward_traversal_tag,
-                                         ElementParser >,
-          private IteratorPolicy
+                                         typename Container::value_type >,
+          private Container::policy::iterator_data
     {
     public:
-        enum Begin_t { Begin };
-        enum End_t { End };
+        typedef typename Container::value_type value_type;
 
         ListParser_Iterator();
-        ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, 
-                            Begin_t);
-        ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, 
-                            End_t);
-        ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, 
-                            PacketParserBase::data_iterator p);
+        explicit ListParser_Iterator(Container const & c);
 
         PacketParserBase::data_iterator raw() const;
+        PacketParserBase::data_iterator i() const;
         
+        static ListParser_Iterator & get(typename Container::policy::iterator_data & d);
+        static ListParser_Iterator const & get(typename Container::policy::iterator_data const & d);
+
     private:
         friend class boost::iterator_core_access;
+        template <class P> friend class ListParser_Container;
         
-        ElementParser dereference() const;
+        value_type dereference() const;
         bool equal(ListParser_Iterator const & other) const;
         void increment();
 
         PacketParserBase::data_iterator i_;
-        PacketParserBase::state_type s_;
+        Container const * c_;
     };
 
+#ifndef DOXYGEN
+
+    template <class ElementParser, class AuxPolicy, class AuxTag>
+    struct ListParserPolicy
+    {};
+
+    template <class ElementParser>
+    struct ListParserTraits
+    {
+        template <class AuxPolicy, class AuxTag>
+        struct parser {
+            typedef senf::ListParser<
+                typename ListParserPolicy<ElementParser, AuxPolicy, AuxTag>::type > type;
+        };
+    };
+
+#   define SENF_PARSER_LIST_I(access, name, size, elt_type)                                       \
+        SENF_PARSER_REQUIRE_VAR(list)                                                             \
+            SENF_PARSER_COLLECTION_I( access,                                                     \
+                                      name,                                                       \
+                                      size,                                                       \
+                                      senf::detail::ListParserTraits<elt_type> )
+
+#endif
+
 }}
 
 ///////////////////////////////ih.e////////////////////////////////////////