X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketRegistry.ct;h=d1ce4666f1143a837808cb44d70f0ad7ae97f7fa;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=4d82e3644cc9fad720cd80629a4c52a5eac14fd3;hpb=26610f603ebdd465307b9621f532c1fe19fd5571;p=senf.git diff --git a/senf/Packets/PacketRegistry.ct b/senf/Packets/PacketRegistry.ct index 4d82e36..d1ce466 100644 --- a/senf/Packets/PacketRegistry.ct +++ b/senf/Packets/PacketRegistry.ct @@ -28,113 +28,183 @@ // Custom includes #include #include +#include +#include #include +#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 +prefix_ bool senf::detail::PacketRegistryImpl::v_empty() + const +{ + return registry_.empty(); } template prefix_ void senf::detail::PacketRegistryImpl::v_dump(std::ostream & os) + const +{ + 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'; + } +} + +template +prefix_ void senf::detail::PacketRegistryImpl::v_clear() +{ + registry_.clear(); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::detail::DumpKey + +template +prefix_ void senf::detail::DumpKey::dump(KeyType const & v, + std::ostream & os) +{ + os << " " << std::setw(16) << std::left << v << std::setw(0) << std::right; +} + +// senf::detail::DumpKey + +template +prefix_ void senf::detail::DumpKey::dump(KeyType const & v, std::ostream & os) { - 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"; + os << " " << senf::format::dumpint(v); } -///////////////////////////////ct.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_