X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketRegistry.ct;h=d1ce4666f1143a837808cb44d70f0ad7ae97f7fa;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=b4babccc279bdbea2cd4639a0f7c2333d0889f59;hpb=af697a0c8591b38f7ee7dbc3d1d0293f4ff72d37;p=senf.git diff --git a/senf/Packets/PacketRegistry.ct b/senf/Packets/PacketRegistry.ct index b4babcc..d1ce466 100644 --- a/senf/Packets/PacketRegistry.ct +++ b/senf/Packets/PacketRegistry.ct @@ -34,98 +34,129 @@ #include #define prefix_ -///////////////////////////////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)); } -/////////////////////////////////////////////////////////////////////////// -// senf::PacketRegistry - -template -prefix_ typename senf::PacketRegistry::Registry & -senf::PacketRegistry::registry() +template +template +prefix_ std::type_info const & +senf::detail::PacketRegistryImpl::EntryImpl::type() + const { - static Registry registry (prettyName(typeid(Tag))); - return registry; + return typeid(PacketType); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::PacketRegistryImpl: template template -prefix_ void senf::detail::PacketRegistryImpl::registerPacket(key_t key) +prefix_ void senf::detail::PacketRegistryImpl::registerPacket(key_t key, int priority) { -#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 ( + SENF_ASSERT_EXPRESSION( 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 + typename Entry::ptr(new EntryImpl(key,priority))).second, + "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 +170,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,10 +184,9 @@ template prefix_ void senf::detail::PacketRegistryImpl::v_clear() { registry_.clear(); - reverseRegistry_.clear(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::DumpKey template @@ -173,7 +204,7 @@ prefix_ void senf::detail::DumpKey::dump(KeyType const & v, std:: os << " " << senf::format::dumpint(v); } -///////////////////////////////ct.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_