// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// 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
/** \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