// $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
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/** \file
- \brief VariantParser.test unit tests */
+ \brief VariantParser unit tests */
//#include "VariantParser.test.hh"
//#include "VariantParser.test.ih"
BOOST_AUTO_UNIT_TEST(VariantParser)
{
typedef senf::ArrayParser<10, senf::UInt8Parser> Array10;
- typedef senf::DirectVariantParser< senf::UInt8Parser, 1, senf::detail::VariantParser_IdentityTranslator,
- senf::VoidPacketParser,
- Array10,
- senf:: UInt32Parser
- >::parser Variant;
+ typedef senf::VariantParser< senf::detail::FixedAuxParserPolicy<senf::UInt8Parser, 1>,
+ boost::mpl::vector<senf::VoidPacketParser, Array10, senf:: UInt32Parser> > Variant;
unsigned char data[] = { 0x01, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1A, 0x1B };
};
}
-namespace {
+// We can't use the unnamed namespace here since there's a bug in gcc-4.2.3 which is
+// the default version of gcc on ubuntu hardy :-(
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34213
+namespace VariantParser_test_cc_anon_namespace {
struct SubParser : public senf::PacketParserBase
{
struct TestParser : public senf::PacketParserBase
{
# include SENF_PARSER()
-
- SENF_PARSER_SKIP_BITS( 4 );
- SENF_PARSER_PRIVATE_BITFIELD( type_, 4, unsigned );
- SENF_PARSER_PRIVATE_VARIANT( content_, type_, (senf::VoidPacketParser)(SubParser) );
- bool hasContent() const { return content_().variant() == 1; }
- void hasContent(bool v) const { if (v) content_().init<1>(); else content_().init<0>(); }
- SubParser content() const { return content_().get<1>(); }
+ SENF_PARSER_BITFIELD_RO( len, 4, unsigned );
+ SENF_PARSER_BITFIELD_RO( type, 4, unsigned );
+ // just here so the second variant is 'var'
+ SENF_PARSER_VARIANT( value, len,
+ (senf::VoidPacketParser)
+ (senf::UInt8Parser)
+ (senf::UInt16Parser)
+ (senf::UInt32Parser)
+ );
+ SENF_PARSER_VARIANT( content_, type,
+ ( novalue( nocontent, key(10, senf::VoidPacketParser) ) )
+ ( id( content, SubParser ) )
+ );
SENF_PARSER_FINALIZE(TestParser);
};
}
+using namespace VariantParser_test_cc_anon_namespace;
BOOST_AUTO_UNIT_TEST(VariantParserMacro)
{
{
TestParser v (p.data().begin(), & p.data());
-
- BOOST_CHECK( ! v.hasContent() );
+ v.init();
+ BOOST_CHECK( ! v.has_content() );
BOOST_CHECK_EQUAL( senf::bytes(v), 1u );
- v.hasContent(true);
+ BOOST_CHECK_EQUAL( v.type(), 10u );
+ v.init_content();
// Parser invalidated
}
{
TestParser v (p.data().begin(), & p.data());
- BOOST_CHECK( v.hasContent() );
+ BOOST_CHECK( v.has_content() );
BOOST_CHECK_EQUAL( senf::bytes(v), 7u );
BOOST_CHECK_EQUAL( v.content().foo(), 0u );
+ BOOST_CHECK_EQUAL( v.type(), 1u );
+ v.nocontent();
+ // Parser invalidated
}
}