Packets: Fix VariantParser invalid parser access bug
[senf.git] / Packets / VectorParser.ih
index af79168..bd46aa1 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -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 {
 
-    /** \brief Internal: Sizer implementing prefix sizing
+#ifndef DOXYGEN
 
-        \internal
+    template <class ElementParser, class AuxPolicy, class AuxTag>
+    struct VectorParserPolicy
+    {};
 
-        This is the sizer policy used by VectorNParser
-     */
-    template <class SizeParser, unsigned Distance>
-    struct VectorNParser_Sizer
+    template <class ElementParser, class AuxPolicy>
+    struct VectorParserPolicy<ElementParser, AuxPolicy, senf::detail::auxtag::none>
     {
-        typedef PacketParserBase::size_type size_type;
-        typedef PacketParserBase::data_iterator iterator;
-        typedef PacketParserBase::state_type state_type;
+        typedef AuxPolicy type;
+    };
 
-        static const size_type init_bytes = 0;
+    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;
+    };
 
-        size_type  size  (iterator i, state_type s) const;
-        void       size  (iterator i, state_type s, size_type v) const;
-        iterator   begin (iterator i, state_type s) const;
-        size_type  bytes (iterator i, state_type s) const;
-        void       init  (iterator i, state_type s) const;
+    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; }
     };
 
-#   define SENF_PARSER_VEC_N_I(field, name, size, elt_type)                                       \
-        typedef senf::VectorNParser< elt_type,                                                    \
-                                     BOOST_PP_CAT(size, _t),                                      \
-                                     SENF_PARSER_CURRENT_FIXED_OFFSET()                           \
-                                         - SENF_PARSER_FIXED_OFFSET(size)                         \
-            >::parser BOOST_PP_CAT(name, _vec_t);                                                 \
-        field( name, BOOST_PP_CAT(name, _vec_t) )
+    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, 
+                typename VectorParserPolicy<ElementParser, AuxPolicy, AuxTag>::type > type;
+        };
+    };
+
+
+#   define SENF_PARSER_VECTOR_I(access, name, size, elt_type)                                     \
+        SENF_PARSER_REQUIRE_VAR(vector)                                                           \
+        SENF_PARSER_COLLECTION_I( access,                                                         \
+                                  name,                                                           \
+                                  size,                                                           \
+                                  senf::detail::VectorParserTraits<elt_type> )
 
+#endif
+
+}}
+                              
 ///////////////////////////////ih.e////////////////////////////////////////
 #endif