X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketRegistry.ct;h=ab0de44ea45a80d859b34f0485efc207d3db5dc3;hb=92f8630b75f3ef50e73c48cde58645dcd1534e27;hp=f3dd1a1c90ed2822e5909e246232328ef6afb341;hpb=145f6a7d0f3a6aaa77b3625351c952d24cb0b8a1;p=senf.git diff --git a/Packets/PacketRegistry.ct b/Packets/PacketRegistry.ct index f3dd1a1..ab0de44 100644 --- a/Packets/PacketRegistry.ct +++ b/Packets/PacketRegistry.ct @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// 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,81 +20,118 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Definition of non-inline template funPacketRegistry.ons +/** \file + \brief PacketRegistry non-inline template implementation */ #include "PacketRegistry.ih" // Custom includes +#include "../Utils/senfassert.hh" #include -#include "Utils/TypeInfo.hh" +#include "../Utils/TypeInfo.hh" #define prefix_ ///////////////////////////////ct.p//////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// +// senf::detail::PkReg_EntryImpl + +template +prefix_ senf::PacketInterpreterBase::factory_t senf::detail::PkReg_EntryImpl::factory() + const +{ + return PacketType::factory(); +} + +template +prefix_ std::string senf::detail::PkReg_EntryImpl::name() + const +{ + return prettyName(typeid(PacketType)); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::PacketRegistry + +template +prefix_ typename senf::PacketRegistry::Registry & +senf::PacketRegistry::registry() +{ + static Registry registry (prettyName(typeid(Tag))); + return registry; +} + +/////////////////////////////////////////////////////////////////////////// +// senf::detail::PacketRegistryImpl: + template -template -prefix_ void senf::impl::PacketRegistryImpl::registerPacket(key_t key) +template +prefix_ void senf::detail::PacketRegistryImpl::registerPacket(key_t key) { +#ifndef SENF_DEBUG + registry_.insert(std::make_pair(key, Entry_ptr(new detail::PkReg_EntryImpl()))); + reverseRegistry_.insert(std::make_pair(senf::typeIdValue(), key)); +#else + bool isUnique ( + registry_.insert( + std::make_pair(key, Entry_ptr(new detail::PkReg_EntryImpl()))).second); // If this assertion fails, a Packet was registered with an already known key - BOOST_ASSERT( registry_.insert(std::make_pair( - key, Entry_ptr(new impl::PkReg_EntryImpl()))).second ); + SENF_ASSERT( isUnique ); + bool isNew ( + reverseRegistry_.insert( + std::make_pair(senf::typeIdValue(), key)).second); // If this assertion fails, the same Packet was registered with two different keys - BOOST_ASSERT( reverseRegistry_.insert( - std::make_pair(senf::typeIdValue(), key)).second ); + SENF_ASSERT( isNew ); +#endif } template -prefix_ typename senf::impl::PacketRegistryImpl::key_t -senf::impl::PacketRegistryImpl::key(senf::TypeIdValue const & type) +prefix_ typename senf::detail::PacketRegistryImpl::key_t +senf::detail::PacketRegistryImpl::key(senf::TypeIdValue const & type) { typename ReversePacketMap::iterator i (reverseRegistry_.find(type)); if (i==reverseRegistry_.end()) - throw PacketTypeNotRegistered(); + throw PacketTypeNotRegisteredException(); return i->second; } -template -prefix_ void -senf::impl::PkReg_EntryImpl::registerInterpreter(Packet const * p, - Packet::iterator b, - Packet::iterator e) +template +prefix_ boost::optional::key_t> +senf::detail::PacketRegistryImpl::key(senf::TypeIdValue const & type, bool) { - p->template registerInterpreter(b,e); + typename ReversePacketMap::iterator i (reverseRegistry_.find(type)); + if (i==reverseRegistry_.end()) + return boost::optional(); + return i->second; } -template -prefix_ senf::Packet::ptr -senf::impl::PkReg_EntryImpl::reinterpret(Packet * p) +template +prefix_ typename senf::detail::PacketRegistryImpl::Entry const & +senf::detail::PacketRegistryImpl::lookup(key_t key) { - return p->template reinterpret(); + typename PacketMap::iterator i (registry_.find(key)); + if (i==registry_.end()) + throw PacketTypeNotRegisteredException(); + return *(i->second); } template -prefix_ typename senf::impl::PacketRegistryImpl::Entry * -senf::impl::PacketRegistryImpl::lookup(key_t key) +prefix_ typename senf::detail::PacketRegistryImpl::Entry const * +senf::detail::PacketRegistryImpl::lookup(key_t key, bool) { typename PacketMap::iterator i (registry_.find(key)); if (i==registry_.end()) - return &impl::pkreg_dataEntry; + return 0; return i->second.get(); } -template -template -prefix_ senf::Packet::ptr -senf::PacketRegistry::create(typename Tag::key_t key, InputIterator b, - InputIterator e) -{ - Packet::ptr p (Packet::create(b,e)); - return registry().lookup(key)->reinterpret(p.get()); -} - -template -prefix_ typename senf::PacketRegistry::Registry & -senf::PacketRegistry::registry() +template +prefix_ void senf::detail::PacketRegistryImpl::v_dump(std::ostream & os) { - static Registry registry; - return registry; + typename PacketMap::const_iterator i (registry_.begin()); + typename PacketMap::const_iterator const i_end (registry_.end()); + for (; i != i_end; ++i) + os << i->first << " " << i->second->name() << "\n"; } ///////////////////////////////ct.e////////////////////////////////////////