Packets: Fix VariantParser invalid parser access bug
[senf.git] / Packets / VectorParser.ih
index 6da8f49..bd46aa1 100644 (file)
@@ -23,8 +23,8 @@
 /** \file
     \brief VectorParser internal header */
 
-#ifndef IH_VectorParser_
-#define IH_VectorParser_ 1
+#ifndef IH_SENF_Packets_VectorParser_
+#define IH_SENF_Packets_VectorParser_ 1
 
 // Custom includes
 
 namespace senf {
 namespace detail {
 
-#   define SENF_PARSER_VEC_N_I(field, name, size, elt_type)                                       \
-        typedef senf::VectorParser<                                                               \
-            elt_type,                                                                             \
-            senf::detail::FixedAuxParserPolicy< BOOST_PP_CAT(size, _t),                           \
-                                                SENF_PARSER_CURRENT_FIXED_OFFSET()                \
-                                                    - SENF_PARSER_FIXED_OFFSET(size) >            \
-        > BOOST_PP_CAT(name, _vec_t);                                                             \
-        field( name, BOOST_PP_CAT(name, _vec_t) )
+#ifndef DOXYGEN
+
+    template <class ElementParser, class AuxPolicy, class AuxTag>
+    struct VectorParserPolicy
+    {};
+
+    template <class ElementParser, class AuxPolicy>
+    struct VectorParserPolicy<ElementParser, AuxPolicy, senf::detail::auxtag::none>
+    {
+        typedef AuxPolicy type;
+    };
+
+    template <class ElementParser, class AuxPolicy, class Transform>
+    struct VectorParserPolicy<ElementParser, AuxPolicy, 
+                              senf::detail::auxtag::transform<Transform,
+                                                              senf::detail::auxtag::none> >
+    {
+        typedef senf::detail::TransformAuxParserPolicy<AuxPolicy, Transform> type;
+    };
+
+    template <unsigned fixedSize>
+    struct VectorParserBytesTransform
+    {
+        typedef PacketParserBase::size_type value_type;
+        static value_type get(value_type v) { return v/fixedSize; }
+        static value_type set(value_type v) { return v*fixedSize; }
+    };
+
+    template <class ElementParser, class AuxPolicy>
+    struct VectorParserPolicy<ElementParser, AuxPolicy, senf::detail::auxtag::bytes>
+    {
+        typedef senf::detail::TransformAuxParserPolicy<
+            AuxPolicy, 
+            VectorParserBytesTransform<ElementParser::fixed_bytes> > type;
+    };
 
     template <class ElementParser>
     struct VectorParserTraits
     {
         template <class AuxPolicy, class AuxTag>
         struct parser {
-            typedef senf::VectorParser<ElementParser, AuxPolicy> type;
+            typedef senf::VectorParser<
+                ElementParser, 
+                typename VectorParserPolicy<ElementParser, AuxPolicy, AuxTag>::type > type;
         };
     };
 
@@ -59,6 +88,8 @@ namespace detail {
                                   size,                                                           \
                                   senf::detail::VectorParserTraits<elt_type> )
 
+#endif
+
 }}
                               
 ///////////////////////////////ih.e////////////////////////////////////////