X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacket.cti;h=a7d5a15001d703a75877d6edab2edf1d8aa2ceab;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=9963d1647809c3607f528349bdae8ea5721cc64f;hpb=9e333f86141055c5248a46028a571c932648696a;p=senf.git diff --git a/Packets/Packet.cti b/Packets/Packet.cti index 9963d16..a7d5a15 100644 --- a/Packets/Packet.cti +++ b/Packets/Packet.cti @@ -1,9 +1,7 @@ -// $Id$ -// -// Copyright (C) 2006 +// Copyright (C) 2007 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) // Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// 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 +18,271 @@ // 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 +{ + return OtherPacket(ptr()->as()); +} + +template +prefix_ OtherPacket senf::Packet::next() + const +{ + OtherPacket p (next(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + + +template +prefix_ OtherPacket senf::Packet::next(NoThrow_t) + const +{ + Packet p (next()); + return p ? p.findNext(nothrow) : OtherPacket(); +} + +template +prefix_ OtherPacket senf::Packet::prev() + const +{ + OtherPacket p (prev(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + +template +prefix_ OtherPacket senf::Packet::prev(NoThrow_t) + const +{ + Packet p (prev()); + return p ? p.findPrev(nothrow) : OtherPacket(); +} + +template +prefix_ OtherPacket senf::Packet::findNext() + const +{ + OtherPacket p (findNext(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + +template +prefix_ OtherPacket senf::Packet::findPrev() + const +{ + OtherPacket p (findPrev(nothrow)); + if (!p) throw InvalidPacketChainException(); + return p; +} + +template +prefix_ OtherPacket senf::Packet::last() + const +{ + return last().findPrev(); +} + +template +prefix_ OtherPacket senf::Packet::last(NoThrow_t) + const +{ + return last().findPrev(nothrow); +} + +template +prefix_ OtherPacket senf::Packet::first() + const +{ + return first().findNext(); +} + +template +prefix_ OtherPacket senf::Packet::first(NoThrow_t) + const +{ + return first().findNext(nothrow); +} + +/////////////////////////////////////////////////////////////////////////// +// 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_ typename senf::Packet::ptr_t::ptr senf::Packet::as() +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, NoInit_t) { - return typename ptr_t::ptr(dynamic_cast(this),true); + return ConcretePacket(interpreter::createAfter(packet.ptr(),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 +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size) { - SATCOM_PKF_REFC_MSG("] Packet::Packet (" << this << "): refcount_ = 1\n"); - arg(this); + return ConcretePacket(interpreter::createAfter(packet.ptr(), size)); } -template -prefix_ senf::impl::PacketImpl::PacketImpl(InputIterator begin, InputIterator end) - : data_(begin, end), interpreters_(), refcount_(1) +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, size_type size, NoInit_t) +{ + return ConcretePacket(interpreter::createAfter(packet.ptr(), size, interpreter::noinit)); +} + +template +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createAfter(Packet packet, ForwardReadableRange const & range) +{ + 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, 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/////////////////////////////////////// @@ -70,4 +295,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: