X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacket.cti;h=e16f88e8caf99557f572ad33cddc2497baff208c;hb=d2459b6c8249291588fd3d0d125ed3d38e003b55;hp=2f655a7f0601a1f63e66bafeb01b219b1d4cbd35;hpb=31d85cd6b8e03c5ecc924ca8892906be1bab702f;p=senf.git diff --git a/Packets/Packet.cti b/Packets/Packet.cti index 2f655a7..e16f88e 100644 --- a/Packets/Packet.cti +++ b/Packets/Packet.cti @@ -1,9 +1,9 @@ // $Id$ // -// Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// 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 // it under the terms of the GNU General Public License as published by @@ -20,44 +20,265 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Definition of inline template functions +/** \file + \brief Packet inline template implementation */ -#include "Packet.ih" +//#include "Packet.ih" // Custom includes +#include "../Utils/Exception.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// -template +/////////////////////////////////////////////////////////////////////////// +// senf::Packet + +// conversion constructors + +template +prefix_ senf::Packet::Packet(ConcretePacket packet) + : packet_(packet.ptr()) +{} + +// interpreter chain access + +template +prefix_ OtherPacket senf::Packet::parseNextAs() + const +{ + return OtherPacket(ptr()->parseNextAs()); +} + +template prefix_ bool senf::Packet::is() const { - return dynamic_cast(this); + return ptr()->is(); +} + +template +prefix_ OtherPacket senf::Packet::as() + const +{ + if (!is()) + throw WrapException(std::bad_cast()); + return OtherPacket(ptr()->as()); +} + +template +prefix_ OtherPacket senf::Packet::next() + const +{ + return next().as(); +} + +template +prefix_ OtherPacket senf::Packet::next(NoThrow_t) + const +{ + Packet p (next(nothrow)); + return p && p.is() ? p.as() : OtherPacket(); +} + +template +prefix_ OtherPacket senf::Packet::find() + const +{ + OtherPacket p (find(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + +template +prefix_ OtherPacket senf::Packet::prev() + const +{ + return prev().as(); +} + +template +prefix_ OtherPacket senf::Packet::prev(NoThrow_t) + const +{ + Packet p (prev(nothrow)); + return p && p.is() ? p.as() : OtherPacket(); +} + +template +prefix_ OtherPacket senf::Packet::rfind() + const +{ + OtherPacket p (rfind(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + +template +prefix_ OtherPacket senf::Packet::last() + const +{ + return last().as(); +} + +template +prefix_ OtherPacket senf::Packet::first() + const +{ + return first().as(); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::ConcretePacket + +// structors and default members + +template +prefix_ senf::ConcretePacket::ConcretePacket() +{} + +template +prefix_ typename senf::ConcretePacket::factory_t +senf::ConcretePacket::factory() +{ + return interpreter::factory(); +} + +// Create completely new packet + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::create() +{ + return ConcretePacket(interpreter::create()); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::create(senf::NoInit_t) +{ + return ConcretePacket(interpreter::create(senf::noinit)); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::create(size_type size) +{ + return ConcretePacket(interpreter::create(size)); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::create(size_type size, senf::NoInit_t) +{ + return ConcretePacket(interpreter::create(size,senf::noinit)); +} + +template +template +prefix_ senf::ConcretePacket senf::ConcretePacket:: +create(ForwardReadableRange const & range, + typename boost::disable_if< boost::is_integral >::type *) +{ + return ConcretePacket(interpreter::create(range)); +} + +// Create packet as new packet after a given packet + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr())); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, senf::NoInit_t) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit)); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(), size)); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size, senf::NoInit_t) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit)); +} + +template +template +prefix_ senf::ConcretePacket senf::ConcretePacket:: +createAfter(Packet packet, ForwardReadableRange const & range, + typename boost::disable_if< boost::is_integral >::type *) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(), range)); +} + +// Create packet as new packet (header) before a given packet + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createBefore(Packet packet) +{ + return ConcretePacket(interpreter::createBefore(packet.ptr())); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createBefore(Packet packet, senf::NoInit_t) +{ + return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit)); +} + +// Create a clone of the current packet + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::clone() + const +{ + return ConcretePacket(ptr()->clone()); } -template -prefix_ typename senf::Packet::ptr_t::ptr senf::Packet::as() +// Field access + +template +prefix_ typename senf::ConcretePacket::Parser * +senf::ConcretePacket::operator->() + const { - return typename ptr_t::ptr(dynamic_cast(this),true); + return ptr()->fields_p(); } -// This constructor appends a new interreter to the interpreter chain -// of an existing Packet -template -prefix_ senf::Packet::Packet(Operation const & arg) - : impl_(0), begin_(arg.begin()), end_(arg.end()), self_(), - parsed_(false), refcount_(1) +template +prefix_ typename senf::ConcretePacket::Parser +senf::ConcretePacket::parser() + const { - SATCOM_PKF_REFC_MSG("] Packet::Packet (" << this << "): refcount_ = 1\n"); - arg(this); + return ptr()->fields(); } -template -prefix_ senf::impl::PacketImpl::PacketImpl(InputIterator begin, InputIterator end) - : data_(begin, end), interpreters_(), refcount_(1) +// private members + +template +prefix_ senf::ConcretePacket::ConcretePacket(typename interpreter::ptr packet_) + : Packet(packet_) +{} + +template +prefix_ typename senf::ConcretePacket::interpreter::ptr +senf::ConcretePacket::ptr() + const { - SATCOM_PKF_REFC_MSG("] PacketImpl::PacketImpl (" << this << "): refcount_ = 1\n") + return boost::static_pointer_cast< PacketInterpreter >(Packet::ptr()); } ///////////////////////////////cti.e/////////////////////////////////////// @@ -71,4 +292,5 @@ prefix_ senf::impl::PacketImpl::PacketImpl(InputIterator begin, InputIterator en // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" +// comment-column: 40 // End: