X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.ih;h=00df8a80270fda5969c1a0f9928d1f98114eeca1;hb=fd3a0e8ac95d1158e9ea661ddf9187b67c70169f;hp=9acee0fa1879fba8ef35caa6c0d3e59ec435f018;hpb=f13c1275e48e97dceb7de7925793a4c69a5aeb61;p=senf.git diff --git a/Packets/PacketParser.ih b/Packets/PacketParser.ih index 9acee0f..00df8a8 100644 --- a/Packets/PacketParser.ih +++ b/Packets/PacketParser.ih @@ -1,6 +1,8 @@ -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// $Id$ +// +// 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 @@ -21,10 +23,11 @@ /** \file \brief PacketParser internal header */ -#ifndef IH_PacketParser_ -#define IH_PacketParser_ 1 +#ifndef IH_SENF_Packets_PacketParser_ +#define IH_SENF_Packets_PacketParser_ 1 // Custom includes +#include "../Utils/mpl.hh" ///////////////////////////////ih.p//////////////////////////////////////// @@ -35,35 +38,63 @@ namespace detail { # ifndef DOXYGEN - template - struct Parser_TakeNum {}; - + // Use SFINAE to check, if Parser has an integer-valued fixed_bytes member. If not, + // 'Parser_TakeNum' fails and the overload is removed from the overload + // set. template PacketParserBase::size_type packetParserSize( - Parser p, int, Parser_TakeNum * = 0); + Parser p, int, senf::mpl::take_uint * = 0); + // An ellipsis is always the worst match. A call 'packetParserSize(p,0) will prefer above + // overload if that is not disabled by SFINAE. template PacketParserBase::size_type packetParserSize(Parser p, ...); - template struct ParserInitBytes_RV { char _[16][n]; }; - + // Same as above: This overload is only enabled, if Parser has an integer values 'init_bytes' + // member. template - ParserInitBytes_RV<1> ParserInitBytes_Choose_(Parser_TakeNum *); - + senf::mpl::rv<0> ParserInitBytes_Choose_(senf::mpl::take_uint *); + template - ParserInitBytes_RV<2> ParserInitBytes_Choose_(...); + senf::mpl::rv<1> ParserInitBytes_Choose_(...); - template + // This version of ParserInitBytes_Choose uses 'Parser::init_bytes' to provide 'value' (via + // 'boost::integral_constant') + template struct ParserInitBytes_Choose : public boost::integral_constant {}; - + // ^^-- g++ error signaled here: + // error: 'fixed_bytes' is not a member of 'some-class-name' + // + // The 'some-class-name' class (as given in the error message) does not seem to be a parser at + // all (it has neither a 'fixed_bytes' nor an 'init_bytes' member). + // + // Either 'some-class-name' is not the class you wanted to use (it really is no parser) or you + // left out either 'init_bytes' or 'fixed_bytes' when defining the parser. This will also + // happen, if you forget to call 'SENF_PARSER_FINALIZE()' when defining a composite parser. + /////////////////////////////////////////////////////////////////////////////////////////////// + + // If Parser::init_bytes is not defined, this specialization is chosen which instead uses + // 'Parser::fixed_bytes' template - struct ParserInitBytes_Choose)> + struct ParserInitBytes_Choose : public boost::integral_constant {}; template struct ParserInitBytes - : public ParserInitBytes_Choose(0))> {}; + : public ParserInitBytes_Choose(0))> {}; + + template + struct ParserIsFixed_Choose + : public boost::false_type {}; + + template + struct ParserIsFixed_Choose + : public boost::true_type {}; + + template + struct ParserIsFixed + : public ParserIsFixed_Choose(0))> {}; # endif