X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.ih;h=defec14b23c0fb1d4d2578edd81e8d8ccdbda6e9;hb=ac86c2bb40746fbedf70a19af3307e5da642b04a;hp=9acee0fa1879fba8ef35caa6c0d3e59ec435f018;hpb=f13c1275e48e97dceb7de7925793a4c69a5aeb61;p=senf.git diff --git a/Packets/PacketParser.ih b/Packets/PacketParser.ih index 9acee0f..defec14 100644 --- a/Packets/PacketParser.ih +++ b/Packets/PacketParser.ih @@ -25,6 +25,7 @@ #define IH_PacketParser_ 1 // Custom includes +#include "../Utils/mpl.hh" ///////////////////////////////ih.p//////////////////////////////////////// @@ -35,35 +36,41 @@ 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 {}; + // 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))> {}; # endif