X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketRegistry.ct;h=dad629ecc7cd4e1b7c6f099dd9cbae9da94761f7;hb=1dec1fc58d8495489db319b2e2efaaa4a55cb9ce;hp=b4babccc279bdbea2cd4639a0f7c2333d0889f59;hpb=af697a0c8591b38f7ee7dbc3d1d0293f4ff72d37;p=senf.git diff --git a/senf/Packets/PacketRegistry.ct b/senf/Packets/PacketRegistry.ct index b4babcc..dad629e 100644 --- a/senf/Packets/PacketRegistry.ct +++ b/senf/Packets/PacketRegistry.ct @@ -37,22 +37,54 @@ ///////////////////////////////ct.p//////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::detail::PkReg_EntryImpl +// senf::detail::PacketRegistryImpl::Entry +template +prefix_ senf::detail::PacketRegistryImpl::Entry::Entry(KeyType const & key_, + int priority_) + : key (key_), priority (priority_) +{} + +template +prefix_ senf::detail::PacketRegistryImpl::Entry::~Entry() +{} + +/////////////////////////////////////////////////////////////////////////// +// senf::detail::PacketRegistryImpl::EntryImpl + +template template -prefix_ senf::PacketInterpreterBase::factory_t senf::detail::PkReg_EntryImpl::factory() +prefix_ senf::detail::PacketRegistryImpl::EntryImpl:: +EntryImpl(KeyType const & key, int priority) + : Entry (key, priority) +{} + +template +template +prefix_ senf::Packet::factory_t +senf::detail::PacketRegistryImpl::EntryImpl::factory() const { return PacketType::factory(); } +template template -prefix_ std::string senf::detail::PkReg_EntryImpl::name() +prefix_ std::string senf::detail::PacketRegistryImpl::EntryImpl::name() const { return prettyName(typeid(PacketType)); } +template +template +prefix_ std::type_info const & +senf::detail::PacketRegistryImpl::EntryImpl::type() + const +{ + return typeid(PacketType); +} + /////////////////////////////////////////////////////////////////////////// // senf::PacketRegistry @@ -69,63 +101,72 @@ senf::PacketRegistry::registry() template 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 - 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 - SENF_ASSERT( isNew ); -#endif +prefix_ void senf::detail::PacketRegistryImpl::registerPacket(key_t key, int priority) +{ + bool ok (registry_.insert( + typename Entry::ptr(new EntryImpl(key,priority))).second); + SENF_ASSERT(ok && "Duplicate packet registration"); +} + +template +template +prefix_ void senf::detail::PacketRegistryImpl::unregisterPacket() +{ + registry_.template get().erase(typeid(PacketType)); +} + +template +prefix_ void senf::detail::PacketRegistryImpl::unregisterPacket(key_t key, int priority) +{ + // Why doesn't this work: + // registry_.erase(boost::make_tuple(key,priority)); + typename Registry::iterator i (registry_.find(boost::make_tuple(key,priority))); + if (i != registry_.end()) + registry_.erase(i); } template 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()) + boost::optional k (key(type,true)); + if (! k) throw PacketTypeNotRegisteredException(); - return i->second; + return *k; } template prefix_ boost::optional::key_t> senf::detail::PacketRegistryImpl::key(senf::TypeIdValue const & type, bool) { - typename ReversePacketMap::iterator i (reverseRegistry_.find(type)); - if (i==reverseRegistry_.end()) + typedef typename Registry::template index::type TypeIndex; + TypeIndex const & typeIndex (registry_.template get()); + typename TypeIndex::const_iterator i (typeIndex.find(type.id())); + if (i == typeIndex.end()) return boost::optional(); - return i->second; + return (*i)->key; } template prefix_ typename senf::detail::PacketRegistryImpl::Entry const & senf::detail::PacketRegistryImpl::lookup(key_t key) { - typename PacketMap::iterator i (registry_.find(key)); - if (i==registry_.end()) + Entry const * e (lookup(key, true)); + if (!e) throw PacketTypeNotRegisteredException(); - return *(i->second); + return *e; } template 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()) + typedef typename Registry::template index::type KeyIndex; + KeyIndex const & keyIndex (registry_.template get()); + typename KeyIndex::const_iterator i (keyIndex.lower_bound(key)); + if (i == keyIndex.end() || (*i)->key != key) return 0; - return i->second.get(); + return i->get(); } template @@ -139,12 +180,13 @@ template prefix_ void senf::detail::PacketRegistryImpl::v_dump(std::ostream & os) const { - typename PacketMap::const_iterator i (registry_.begin()); - typename PacketMap::const_iterator const i_end (registry_.end()); - for (; i != i_end; ++i) { - std::string n (i->second->name()); - senf::detail::DumpKey::dump(i->first, os); - os << ' ' << n.substr(21,n.size()-22) << "\n"; + typedef typename Registry::template index::type KeyIndex; + KeyIndex const & keyIndex (registry_.template get()); + for (typename KeyIndex::iterator i (keyIndex.begin()), i_end (keyIndex.end()); + i != i_end; ++i) { + std::string n ((*i)->name()); + senf::detail::DumpKey::dump((*i)->key, os); + os << ' ' << std::setw(6) << (*i)->priority << ' ' << n.substr(21,n.size()-22) << '\n'; } } @@ -152,7 +194,6 @@ template prefix_ void senf::detail::PacketRegistryImpl::v_clear() { registry_.clear(); - reverseRegistry_.clear(); } ///////////////////////////////////////////////////////////////////////////