Packets: Packet Registry unregister() support
[senf.git] / senf / Packets / PacketRegistry.ct
index df12669..0048815 100644 (file)
@@ -31,6 +31,7 @@
 #include <iomanip>
 #include <cmath>
 #include <senf/Utils/TypeInfo.hh>
+#include <senf/Utils/Format.hh>
 
 #define prefix_
 ///////////////////////////////ct.p////////////////////////////////////////
@@ -52,6 +53,13 @@ prefix_ std::string senf::detail::PkReg_EntryImpl<PacketType>::name()
     return prettyName(typeid(PacketType));
 }
 
+template <class PacketType>
+prefix_ senf::TypeIdValue senf::detail::PkReg_EntryImpl<PacketType>::typeIdValue()
+    const
+{
+    return typeid(PacketType);
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::PacketRegistry<Tag>
 
@@ -88,6 +96,30 @@ prefix_ void senf::detail::PacketRegistryImpl<KeyType>::registerPacket(key_t key
 }
 
 template <class KeyType>
+template <class PacketType>
+prefix_ void senf::detail::PacketRegistryImpl<KeyType>::unregisterPacket()
+{
+    typename PacketMap::iterator i (registry_.find(key(typeIdValue<PacketType>())));
+    typename ReversePacketMap::iterator j (reverseRegistry_.find(typeIdValue<PacketType>()));
+    if (i != registry_.end())
+        registry_.erase(i);
+    if (j != reverseRegistry_.end())
+        reverseRegistry_.erase(j);
+}
+
+template <class KeyType>
+prefix_ void senf::detail::PacketRegistryImpl<KeyType>::unregisterPacket(key_t key)
+{
+    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);
+}
+
+template <class KeyType>
 prefix_ typename senf::detail::PacketRegistryImpl<KeyType>::key_t
 senf::detail::PacketRegistryImpl<KeyType>::key(senf::TypeIdValue const & type)
 {
@@ -169,19 +201,7 @@ prefix_ void senf::detail::DumpKey<KeyType,is_integral>::dump(KeyType const & v,
 template <class KeyType>
 prefix_ void senf::detail::DumpKey<KeyType, true>::dump(KeyType const & v, std::ostream & os)
 {
-    int bytes ((std::numeric_limits<KeyType>::digits+7)/8);
-    int digs (int(2.4*bytes)+1);
-
-    os << "  0x" << std::setw(2*bytes) << std::setfill('0') << std::hex 
-       << typename senf::detail::CharToInt<KeyType>::type (v)
-       << " (" << std::setw(digs) << std::setfill(' ') << std::dec 
-       << typename senf::detail::CharToInt<KeyType>::type (v)
-       << ") (";
-    for (int i (bytes-1); i>=0; --i) {
-        char c ((v>>(8*i))&0xff);
-        os << ((c>=32 && c<=127) ? c : '.');
-    }
-    os << ')';
+    os << "  " << senf::format::dumpint(v);
 }
 
 ///////////////////////////////ct.e////////////////////////////////////////