X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FVariantParser.cti;h=d694cf620b5a19d22a1742871ecaac2d740b4a8b;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=af9a6515e010c4cb38f77166a458214c86f2a8ff;hpb=51044eb18f034c1a059ffe2fb109a422c1cbe251;p=senf.git diff --git a/Packets/VariantParser.cti b/Packets/VariantParser.cti index af9a651..d694cf6 100644 --- a/Packets/VariantParser.cti +++ b/Packets/VariantParser.cti @@ -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 // // This program is free software; you can redistribute it and/or modify @@ -33,55 +33,55 @@ ///////////////////////////////cti.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::VariantParser +// senf::VariantParser -template -prefix_ senf::VariantParser:: +template +prefix_ senf::VariantParser:: VariantParser(data_iterator i, state_type s) : PacketParserBase(i,s) {} -template -prefix_ senf::VariantParser:: -VariantParser(VariantPolicy policy, data_iterator i, state_type s) - : PacketParserBase(i,s), VariantPolicy(policy) +template +prefix_ senf::VariantParser:: +VariantParser(AuxPolicy policy, data_iterator i, state_type s) + : PacketParserBase(i,s), AuxPolicy(policy) {} -template +template prefix_ senf::PacketParserBase::size_type -senf::VariantParser::bytes() +senf::VariantParser::bytes() const { return detail::VariantBytes< VariantParser, boost::mpl::size::value - 1 > - ::bytes(*this, variant()) + VariantPolicy::bytes(i(),state()); + ::bytes(*this, variant()) + AuxPolicy::aux_bytes; } -template +template prefix_ void -senf::VariantParser::init() +senf::VariantParser::init() { - VariantPolicy::variant(0,i(),state()); + AuxPolicy::aux(0,i(),state()); get<0>().init(); } -template -prefix_ unsigned senf::VariantParser::variant() +template +prefix_ unsigned senf::VariantParser::variant() const { - return VariantPolicy::variant(i(),state()); + return AuxPolicy::aux(i(),state()); } -template +template template prefix_ typename boost::mpl::at< - typename senf::VariantParser::parsers, + typename senf::VariantParser::parsers, boost::mpl::int_ >::type -senf::VariantParser::get() +senf::VariantParser::get() const { SENF_ASSERT( variant() == N ); return typename boost::mpl::at >::type( - VariantPolicy::begin(i(), state()), state() ); + AuxPolicy::adjust(i(), state()), state() ); } ///////////////////////////////////////////////////////////////////////// @@ -104,6 +104,54 @@ senf::detail::VariantBytes::bytes(Variant const & v, unsigned n) return senf::bytes(v.template get<0>()); } +/////////////////////////////////////////////////////////////////////////// +// senf::detail::VariantKeyTransform + +template +prefix_ unsigned senf::detail::VariantKeyTransform::get(input_type v) +{ + return VariantKeyTransformCheck< + input_type, value_type, Keys, boost::mpl::size::type::value-1>::get(v); +} + +template +prefix_ typename senf::detail::VariantKeyTransform::input_type +senf::detail::VariantKeyTransform::set(unsigned v) +{ + return VariantKeyTransformCheck< + input_type, value_type, Keys, boost::mpl::size::type::value-1>::set(v); +} + +template +prefix_ Out senf::detail::VariantKeyTransformCheck::get(In v) +{ + if (boost::mpl::at >::type::key() == v) + return N; + else + return VariantKeyTransformCheck::get(v); +} + +template +prefix_ In senf::detail::VariantKeyTransformCheck::set(Out v) +{ + if (v == N) + return boost::mpl::at >::type::key(); + else + return VariantKeyTransformCheck::set(v); +} + +template +prefix_ Out senf::detail::VariantKeyTransformCheck::get(In v) +{ + return 0; +} + +template +prefix_ In senf::detail::VariantKeyTransformCheck::set(Out v) +{ + return boost::mpl::at >::type::key(); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_