// $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 // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file \brief Packet inline template implementation */ //#include "Packet.ih" // Custom includes #include #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::Packet // conversion constructors template prefix_ senf::Packet::Packet(ConcretePacket const & 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 valid() && ptr()->is(); } template prefix_ OtherPacket senf::Packet::as() const { if (!is()) throw WrapException(std::bad_cast()) << ": called packet::as() with wrong PacketType: " << (valid() ? typeId().prettyName() : "invalid packet") << " != " << prettyName(typeid(OtherPacket)); return OtherPacket(ptr()->as()); } template prefix_ OtherPacket senf::Packet::as(NoThrow_t) const { SENF_ASSERT( is(), "Bad cast, called packet::as(nothrow) with wrong PacketType"); 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() ? OtherPacket(p.ptr()->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() ? OtherPacket(p.ptr()->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(); } template prefix_ void senf::Packet::finalizeTo() { Packet p (find(nothrow)); ptr()->finalizeTo(p ? p.ptr() : last().ptr()); } template prefix_ Annotation & senf::Packet::annotation() { return ptr()->annotation(); } template prefix_ Annotation const & senf::Packet::annotation() const { return ptr()->annotation(); } //-///////////////////////////////////////////////////////////////////////////////////////////////// // 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)); } #ifndef DOXYGEN template template 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 const & packet) { return ConcretePacket(interpreter::createAfter(packet.ptr())); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createAfter(Packet const & packet, senf::NoInit_t) { return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit)); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createAfter(Packet const & packet, size_type size) { return ConcretePacket(interpreter::createAfter(packet.ptr(), size)); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createAfter(Packet const & packet, size_type size, senf::NoInit_t) { return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit)); } #ifndef DOXYGEN template template 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 const & packet) { return ConcretePacket(interpreter::createBefore(packet.ptr())); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createBefore(Packet const & packet, senf::NoInit_t) { return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit)); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createInsertBefore(Packet const & packet) { return ConcretePacket(interpreter::createInsertBefore(packet.ptr())); } template prefix_ senf::ConcretePacket senf::ConcretePacket::createInsertBefore(Packet const & packet, senf::NoInit_t) { return ConcretePacket(interpreter::createInsertBefore(packet.ptr(), senf::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::Parser senf::ConcretePacket::parser() const { return ptr()->fields(); } template prefix_ typename senf::ConcretePacket::ParserProxy senf::ConcretePacket::operator->() const { return ParserProxy(parser()); } // private members template prefix_ senf::ConcretePacket::ConcretePacket(typename interpreter::ptr const & packet_) : Packet(packet_) {} template prefix_ typename senf::ConcretePacket::interpreter * senf::ConcretePacket::ptr() const { return static_cast< PacketInterpreter *>( Packet::ptr().get()); } //-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ // Local Variables: // mode: c++ // fill-column: 100 // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" // comment-column: 40 // End: