X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketRegistry.ct;h=d1ce4666f1143a837808cb44d70f0ad7ae97f7fa;hb=7661548b20e6c7627f54bff87e0758396fd523ef;hp=0048815232734ce36d8786d1ce6984d52f639c0f;hpb=3e2082d6966ef4e61ff8a2070b157251e5cb08a6;p=senf.git diff --git a/senf/Packets/PacketRegistry.ct b/senf/Packets/PacketRegistry.ct index 0048815..d1ce466 100644 --- a/senf/Packets/PacketRegistry.ct +++ b/senf/Packets/PacketRegistry.ct @@ -34,129 +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)); } +template template -prefix_ senf::TypeIdValue senf::detail::PkReg_EntryImpl::typeIdValue() +prefix_ std::type_info const & +senf::detail::PacketRegistryImpl::EntryImpl::type() const { return 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::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() { - typename PacketMap::iterator i (registry_.find(key(typeIdValue()))); - typename ReversePacketMap::iterator j (reverseRegistry_.find(typeIdValue())); - if (i != registry_.end()) - registry_.erase(i); - if (j != reverseRegistry_.end()) - reverseRegistry_.erase(j); + registry_.template get().erase(typeid(PacketType)); } template -prefix_ void senf::detail::PacketRegistryImpl::unregisterPacket(key_t key) +prefix_ void senf::detail::PacketRegistryImpl::unregisterPacket(key_t key, int priority) { - typename PacketMap::iterator i (registry_.find(key)); - if (i == registry_.end()) - throw PacketTypeNotRegisteredException(); - typename ReversePacketMap::iterator j (reverseRegistry_.find(i->second->typeIdValue())); - registry_.erase(i); - if (j != reverseRegistry_.end()) - reverseRegistry_.erase(j); + // 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 @@ -170,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'; } } @@ -183,10 +184,9 @@ template prefix_ void senf::detail::PacketRegistryImpl::v_clear() { registry_.clear(); - reverseRegistry_.clear(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::DumpKey template @@ -204,7 +204,7 @@ prefix_ void senf::detail::DumpKey::dump(KeyType const & v, std:: os << " " << senf::format::dumpint(v); } -///////////////////////////////ct.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_