// $Id$ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) // // The contents of this file are subject to the Fraunhofer FOKUS Public License // Version 1.0 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // http://senf.berlios.de/license.html // // The Fraunhofer FOKUS Public License Version 1.0 is based on, // but modifies the Mozilla Public License Version 1.1. // See the full license text for the amendments. // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License // for the specific language governing rights and limitations under the License. // // The Original Code is Fraunhofer FOKUS code. // // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. // (registered association), Hansastraße 27 c, 80686 Munich, Germany. // All Rights Reserved. // // Contributor(s): // Stefan Bund /** \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 { // ensure that the template class is included in the corresponding object file when linking: { static typename PacketInterpreter::factory_t _ ( PacketInterpreter::factory()); (void) _;} return valid() && typeId() == typeIdValue(); } 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()); } template prefix_ senf::Packet senf::ConcretePacket::next(NoThrow_t) const { PacketInterpreterBase::ptr p (Packet::ptr()->next()); if (p) return Packet(p); PacketInterpreterBase::optional_range r (type::nextPacketRange(*this)); return (r && ! r->empty()) ? Packet(getNext(r)) : Packet(); } // 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: