X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacket.cti;h=ed032da0160e70bf22d74929bec68ac5b752a058;hb=be4e99b96b305cb8f8c6a00a0098392483089812;hp=719663d17194fa719a10d511edd9e07b0f4f6172;hpb=85ab07d100a382467a42e19d741d403a7a96c951;p=senf.git diff --git a/Packets/Packet.cti b/Packets/Packet.cti index 719663d..ed032da 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,47 +20,222 @@ // 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 #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 std::bad_cast(); + return OtherPacket(ptr()->as()); +} + +template +prefix_ OtherPacket senf::Packet::next() + const +{ + Packet p (next()) + return p ? p.as() : OtherPacket(); +} + +template +prefix_ OtherPacket senf::Packet::prev() + const +{ + Packet p (prev()); + return p ? p.as() : OtherPacket(); +} + +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(NoInit_t) +{ + return ConcretePacket(interpreter::create(interpreter::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, NoInit_t) +{ + return ConcretePacket(interpreter::create(size,interpreter::noinit)); +} + +template +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::create(ForwardReadableRange const & range) +{ + 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, NoInit_t) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(),interpreter::noinit)); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(), size)); } -template -prefix_ typename senf::Packet::ptr_t::ptr senf::Packet::as() +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size, NoInit_t) { - return typename ptr_t::ptr(dynamic_cast(this),true); + return ConcretePacket(interpreter::createAfter(packet.ptr(), size, interpreter::noinit)); } -// 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 +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, ForwardReadableRange const & range) { - SATCOM_PKF_REFC_MSG("] Packet::Packet (" << this << "): refcount_ = 1\n"); - /** \fixme This is not exception safe, if an exception is thrown in - the derived class constuctor, the effects of this call must be - undone which is not possible in a simple way. */ - arg(this); + return ConcretePacket(interpreter::createAfter(packet.ptr(), range)); } -template -prefix_ senf::impl::PacketImpl::PacketImpl(InputIterator begin, InputIterator end) - : data_(begin, end), interpreters_(), refcount_(1) +// 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, NoInit_t) +{ + return ConcretePacket(interpreter::createBefore(packet.ptr(), interpreter::noinit)); +} + +// Create a clone of the current packet + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::clone() + const +{ + return ConcretePacket(ptr()->clone()); +} + +// Field access + +template +prefix_ typename senf::ConcretePacket::type::parser * +senf::ConcretePacket::operator->() + const +{ + return ptr()->fields_p(); +} + +// 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/////////////////////////////////////// @@ -73,4 +248,6 @@ prefix_ senf::impl::PacketImpl::PacketImpl(InputIterator begin, InputIterator en // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: