X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacket.cti;h=afae6069db5e853e17975d293110966a69f754b4;hb=c45c112ae88196ea8da9c5a9efb0e167196744d2;hp=c17dc6fa9b406dfd9833aac1a7155f6ad79821d5;hpb=47368f306a577d1e46df69a7f729bd3893cbe5e7;p=senf.git diff --git a/Packets/Packet.cti b/Packets/Packet.cti index c17dc6f..afae606 100644 --- a/Packets/Packet.cti +++ b/Packets/Packet.cti @@ -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 @@ -24,6 +26,7 @@ //#include "Packet.ih" // Custom includes +#include "../Utils/Exception.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// @@ -58,6 +61,8 @@ template prefix_ OtherPacket senf::Packet::as() const { + if (!is()) + throw WrapException(std::bad_cast()); return OtherPacket(ptr()->as()); } @@ -65,51 +70,46 @@ template prefix_ OtherPacket senf::Packet::next() const { - OtherPacket p (next(nothrow)); - if (!p) throw InvalidPacketChainException(); - return p; + return next().as(); } - template prefix_ OtherPacket senf::Packet::next(NoThrow_t) const { - Packet p (next()); - return p ? p.findNext(nothrow) : OtherPacket(); + Packet p (next(nothrow)); + return p && p.is() ? p.as() : OtherPacket(); } template -prefix_ OtherPacket senf::Packet::prev() +prefix_ OtherPacket senf::Packet::find() const { - OtherPacket p (prev(nothrow)); + OtherPacket p (find(nothrow)); if (!p) throw InvalidPacketChainException(); return p; } template -prefix_ OtherPacket senf::Packet::prev(NoThrow_t) +prefix_ OtherPacket senf::Packet::prev() const { - Packet p (prev()); - return p ? p.findPrev(nothrow) : OtherPacket(); + return prev().as(); } template -prefix_ OtherPacket senf::Packet::findNext() +prefix_ OtherPacket senf::Packet::prev(NoThrow_t) const { - OtherPacket p (findNext(nothrow)); - if (!p) throw InvalidPacketChainException(); - return p; + Packet p (prev(nothrow)); + return p && p.is() ? p.as() : OtherPacket(); } template -prefix_ OtherPacket senf::Packet::findPrev() +prefix_ OtherPacket senf::Packet::rfind() const { - OtherPacket p (findPrev(nothrow)); + OtherPacket p (rfind(nothrow)); if (!p) throw InvalidPacketChainException(); return p; } @@ -118,28 +118,34 @@ template prefix_ OtherPacket senf::Packet::last() const { - return last().findPrev(); + return last().as(); } template -prefix_ OtherPacket senf::Packet::last(NoThrow_t) +prefix_ OtherPacket senf::Packet::first() const { - return last().findPrev(nothrow); + return first().as(); } -template -prefix_ OtherPacket senf::Packet::first() - const +template +prefix_ void senf::Packet::finalizeTo() { - return first().findNext(); + Packet p (find(nothrow)); + ptr()->finalizeTo(p ? p.ptr() : last().ptr()); } -template -prefix_ OtherPacket senf::Packet::first(NoThrow_t) +template +prefix_ Annotation & senf::Packet::annotation() +{ + return ptr()->annotation(); +} + +template +prefix_ Annotation const & senf::Packet::annotation() const { - return first().findNext(nothrow); + return ptr()->annotation(); } /////////////////////////////////////////////////////////////////////////// @@ -169,9 +175,9 @@ senf::ConcretePacket::create() template prefix_ senf::ConcretePacket -senf::ConcretePacket::create(NoInit_t) +senf::ConcretePacket::create(senf::NoInit_t) { - return ConcretePacket(interpreter::create(interpreter::noinit)); + return ConcretePacket(interpreter::create(senf::noinit)); } template @@ -183,71 +189,82 @@ senf::ConcretePacket::create(size_type size) template prefix_ senf::ConcretePacket -senf::ConcretePacket::create(size_type size, NoInit_t) +senf::ConcretePacket::create(size_type size, senf::NoInit_t) { - return ConcretePacket(interpreter::create(size,interpreter::noinit)); + return ConcretePacket(interpreter::create(size,senf::noinit)); } +#ifndef DOXYGEN + template template -prefix_ senf::ConcretePacket -senf::ConcretePacket::create(ForwardReadableRange const & range) +prefix_ senf::ConcretePacket senf::ConcretePacket:: +create(ForwardReadableRange const & range, + typename boost::disable_if< boost::is_integral >::type *) { return ConcretePacket(interpreter::create(range)); } +#endif + // Create packet as new packet after a given packet template prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet packet) +senf::ConcretePacket::createAfter(Packet const & packet) { return ConcretePacket(interpreter::createAfter(packet.ptr())); } template prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet packet, NoInit_t) +senf::ConcretePacket::createAfter(Packet const & packet, senf::NoInit_t) { - return ConcretePacket(interpreter::createAfter(packet.ptr(),interpreter::noinit)); + return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit)); } template prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet packet, size_type size) +senf::ConcretePacket::createAfter(Packet const & packet, size_type size) { return ConcretePacket(interpreter::createAfter(packet.ptr(), size)); } template prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet packet, size_type size, NoInit_t) +senf::ConcretePacket::createAfter(Packet const & packet, size_type size, + senf::NoInit_t) { - return ConcretePacket(interpreter::createAfter(packet.ptr(), size, interpreter::noinit)); + return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit)); } +#ifndef DOXYGEN + template template -prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet packet, ForwardReadableRange const & range) +prefix_ senf::ConcretePacket senf::ConcretePacket:: +createAfter(Packet const & packet, ForwardReadableRange const & range, + typename boost::disable_if< boost::is_integral >::type *) { return ConcretePacket(interpreter::createAfter(packet.ptr(), range)); } +#endif + // Create packet as new packet (header) before a given packet template prefix_ senf::ConcretePacket -senf::ConcretePacket::createBefore(Packet packet) +senf::ConcretePacket::createBefore(Packet const & packet) { return ConcretePacket(interpreter::createBefore(packet.ptr())); } template prefix_ senf::ConcretePacket -senf::ConcretePacket::createBefore(Packet packet, NoInit_t) +senf::ConcretePacket::createBefore(Packet const & packet, senf::NoInit_t) { - return ConcretePacket(interpreter::createBefore(packet.ptr(), interpreter::noinit)); + return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit)); } // Create a clone of the current packet @@ -263,11 +280,19 @@ senf::ConcretePacket::clone() // Field access template -prefix_ typename senf::ConcretePacket::interpreter::parser * +prefix_ typename senf::ConcretePacket::Parser +senf::ConcretePacket::parser() + const +{ + return ptr()->fields(); +} + +template +prefix_ typename senf::ConcretePacket::ParserProxy senf::ConcretePacket::operator->() const { - return ptr()->fields_p(); + return ParserProxy(parser()); } // private members @@ -296,4 +321,5 @@ senf::ConcretePacket::ptr() // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" +// comment-column: 40 // End: