#include <boost/test/test_tools.hpp>
#define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace {
struct ComplexAnnotation : senf::ComplexAnnotation
{
- ComplexAnnotation() : s(), i() {}
+ ComplexAnnotation() : s("empty"), i(-1) {}
std::string s;
boost::int32_t i;
+ // padding so the size does not depend on the platform ...
+ struct _ {std::string s;boost::int32_t i;};
+ char __ [32-sizeof(_)];
};
std::ostream & operator<<(std::ostream & os, ComplexAnnotation const & v)
senf::Packet packet (FooPacket::create());
BarPacket::createAfter(packet);
+ BOOST_CHECK_THROW( senf::Packet().as<BarPacket>(), senf::WrapException<std::bad_cast> );
+ BOOST_CHECK_THROW( packet.as<BarPacket>(), senf::WrapException<std::bad_cast> );
+
BOOST_REQUIRE( packet );
BOOST_CHECK( packet.next() );
BOOST_CHECK( ! packet.next().next(senf::nothrow) );
BOOST_CHECK( packet.first() == packet );
BOOST_CHECK( packet.last() == packet.next() );
+ BOOST_CHECK( ! packet.is_shared() );
+ {
+ senf::Packet p2 (packet);
+ BOOST_CHECK( packet.is_shared() );
+ BOOST_CHECK( p2.is_shared() );
+ }
+ BOOST_CHECK( ! packet.is_shared() );
+
senf::Packet p2 (packet.next());
BOOST_CHECK( p2 );
+ BOOST_CHECK( packet.is_shared() );
+ BOOST_CHECK( p2.is_shared() );
packet.parseNextAs<FooPacket>();
BOOST_CHECK_EQUAL( packet.size(), 12u );
BOOST_CHECK_EQUAL( packet.next().size(), 8u );
BOOST_CHECK( packet.next().as<FooPacket>() );
p2 = packet.next().clone();
+ BOOST_CHECK( ! packet.is_shared() );
BOOST_REQUIRE( p2 );
packet.next().append( p2 );
BOOST_REQUIRE( packet.next().next() );
BarPacket::createAfter(packet);
ComplexAnnotation & ca (packet.annotation<ComplexAnnotation>());
+
+ BOOST_CHECK_EQUAL( ca.s, "empty" );
+ BOOST_CHECK_EQUAL( ca.i, -1 );
+
ca.s = "dead beef";
ca.i = 0x12345678;
SENF_CHECK_NO_THROW( packet.annotation<IntAnnotation>().value = 0xDEADBEEF );
BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().s, "dead beef" );
BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().i, 0x12345678 );
+ senf::Packet pClone (packet.clone());
+
+ p2.clearAnnotations();
+ BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().s, "empty" );
+ BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().i, -1 );
+ BOOST_CHECK_EQUAL( p2.annotation<IntAnnotation>().value, 0 );
+
+ BOOST_CHECK_EQUAL( pClone.annotation<IntAnnotation>().value, 0xDEADBEEFu );
+ BOOST_CHECK_EQUAL( pClone.annotation<ComplexAnnotation>().s, "dead beef" );
+ BOOST_CHECK_EQUAL( pClone.annotation<ComplexAnnotation>().i, 0x12345678 );
+
BOOST_CHECK( Reg::lookup<IntAnnotation>() >= 0 );
BOOST_CHECK( Reg::lookup<LargeAnnotation>() < 0 );
BOOST_CHECK( Reg::lookup<ComplexAnnotation>() < 0 );
BOOST_CHECK( Reg::lookup<ComplexEmptyAnnotation>() < 0 );
-#ifdef SENF_DEBUG
std::stringstream ss;
-
senf::dumpPacketAnnotationRegistry(ss);
BOOST_CHECK_EQUAL(
ss.str(),
"SENF_PACKET_ANNOTATION_SLOTS = 8\n"
"SENF_PACKET_ANNOTATION_SLOTSIZE = 16\n"
"TYPE FAST COMPLEX SIZE\n"
- "(anonymous namespace)::ComplexAnnotation no yes 8\n"
+ "(anonymous namespace)::ComplexAnnotation no yes 32\n"
"(anonymous namespace)::ComplexEmptyAnnotation no yes 1\n"
"(anonymous namespace)::IntAnnotation yes no 4\n"
"(anonymous namespace)::LargeAnnotation no no 32\n" );
-#endif
}
#ifdef COMPILE_CHECK
#endif
-///////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
\f