Packets: static assertion for duplicate tlv parser registration
tho [Fri, 23 Sep 2011 12:52:06 +0000 (12:52 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1812 270642c3-0616-0410-b53a-bc976706d245

senf/Packets/GenericTLV.ct
senf/Packets/PacketRegistry.ct
senf/Packets/PacketRegistry.cti
senf/Packets/PacketRegistry.ih
senf/Socket/ReadWritePolicy.cc
senf/Utils/Console/Server.cc

index 1fa98e3..cb71af7 100644 (file)
@@ -102,9 +102,9 @@ template <typename Parser>
 prefix_ void senf::GenericTLVParserRegistry<BaseParser,Keytype>::registerParser()
 {
     Keytype key (Parser::typeId+0);
-    typename Map::iterator i (map_.find( key ));
-    if (i == map_.end() )
-        map_.insert(key, new detail::GenericTLVParserRegistry_Entry<BaseParser, Parser>() );
+    SENF_ASSERT_EXPRESSION(
+            map_.insert( key, new detail::GenericTLVParserRegistry_Entry<BaseParser, Parser>()).second == true,
+        "Duplicate TLV registration");
 }
 
 // Wow ... this is stupid .. Boost 1.33 ptr_map API is broken ...
index 6c594b9..81e9983 100644 (file)
@@ -106,7 +106,7 @@ template <class KeyType>
 template <class PacketType>
 prefix_ void senf::detail::PacketRegistryImpl<KeyType>::unregisterPacket()
 {
-    registry_.template get<ByType>().erase(typeid(PacketType));
+    registryByType_.erase(typeid(PacketType));
 }
 
 template <class KeyType>
@@ -133,10 +133,8 @@ template <class KeyType>
 prefix_ boost::optional<typename senf::detail::PacketRegistryImpl<KeyType>::key_t>
 senf::detail::PacketRegistryImpl<KeyType>::key(senf::TypeIdValue const & type, bool)
 {
-    typedef typename Registry::template index<ByType>::type TypeIndex;
-    TypeIndex const & typeIndex (registry_.template get<ByType>());
-    typename TypeIndex::const_iterator i (typeIndex.find(type.id()));
-    if (i == typeIndex.end())
+    typename RegistryByType::const_iterator i (registryByType_.find(type.id()));
+    if (i == registryByType_.end())
         return boost::optional<key_t>();
     return (*i)->key;
 }
@@ -144,6 +142,7 @@ senf::detail::PacketRegistryImpl<KeyType>::key(senf::TypeIdValue const & type, b
 template <class KeyType>
 prefix_ typename senf::detail::PacketRegistryImpl<KeyType>::Entry const &
 senf::detail::PacketRegistryImpl<KeyType>::lookup(key_t key)
+    const
 {
     Entry const * e (lookup(key, true));
     if (!e)
@@ -154,11 +153,10 @@ senf::detail::PacketRegistryImpl<KeyType>::lookup(key_t key)
 template <class KeyType>
 prefix_ typename senf::detail::PacketRegistryImpl<KeyType>::Entry const *
 senf::detail::PacketRegistryImpl<KeyType>::lookup(key_t key, bool)
+    const
 {
-    typedef typename Registry::template index<ByKey>::type KeyIndex;
-    KeyIndex const & keyIndex (registry_.template get<ByKey>());
-    typename KeyIndex::const_iterator i (keyIndex.lower_bound(key));
-    if (i == keyIndex.end() || (*i)->key != key)
+    typename RegistryByKey::const_iterator i (registryByKey_.lower_bound(key));
+    if (i == registryByKey_.end() || (*i)->key != key)
         return 0;
     return i->get();
 }
@@ -174,10 +172,7 @@ template <class KeyType>
 prefix_ void senf::detail::PacketRegistryImpl<KeyType>::v_dump(std::ostream & os)
     const
 {
-    typedef typename Registry::template index<ByKey>::type KeyIndex;
-    KeyIndex const & keyIndex (registry_.template get<ByKey>());
-    for (typename KeyIndex::iterator i (keyIndex.begin()), i_end (keyIndex.end());
-         i != i_end; ++i) {
+    for (typename RegistryByKey::const_iterator i (registryByKey_.begin()), i_end (registryByKey_.end()); i != i_end; ++i) {
         std::string n ((*i)->name());
         senf::detail::DumpKey<KeyType>::dump((*i)->key, os);
         os << ' ' << std::setw(6) << (*i)->priority << ' ' << n.substr(21,n.size()-22) << '\n';
index df4df66..d999b0e 100644 (file)
@@ -152,6 +152,8 @@ senf::PacketRegistry<Tag>::registry()
 
 template <class KeyType>
 prefix_ senf::detail::PacketRegistryImpl<KeyType>::PacketRegistryImpl(std::string const & name)
+    : registryByKey_( registry_.template get<ByKey>()),
+      registryByType_( registry_.template get<ByType>())
 {
     registries()[name] = this;
 }
index adf2f28..c5d3ac4 100644 (file)
@@ -125,6 +125,8 @@ namespace detail {
         {};
 
         typedef boost::multi_index_container<typename Entry::ptr, RegistryIndices> Registry;
+        typedef typename Registry::template index<ByKey>::type RegistryByKey;
+        typedef typename Registry::template index<ByType>::type RegistryByType;
 
         template <class PacketType>
         struct EntryImpl : public Entry
@@ -161,8 +163,8 @@ namespace detail {
         key_t key(senf::TypeIdValue const & type);
         boost::optional<key_t> key(senf::TypeIdValue const & type, bool);
 
-        Entry const & lookup(key_t key);
-        Entry const * lookup(key_t key, bool);
+        Entry const & lookup(key_t key) const;
+        Entry const * lookup(key_t key, bool) const;
 
         iterator begin() const;
         iterator end() const;
@@ -175,6 +177,8 @@ namespace detail {
         virtual void v_clear();
 
         Registry registry_;
+        RegistryByKey & registryByKey_;
+        RegistryByType & registryByType_;
     };
 
     template <class KeyType, bool is_integral=std::numeric_limits<KeyType>::is_integer>
index eb04cf7..a573e5d 100644 (file)
@@ -133,9 +133,9 @@ prefix_ unsigned senf::WriteablePolicy::do_writeto(FileHandle & handle,
                 rv = 0;
                 break;
             default:
-               std::stringstream a, b;
+                std::stringstream a, b;
                 senf::hexdump( (char*) addr , ((char*) addr) + len , a);
-               senf::hexdump( (char*) buffer , ((char*) buffer) + size , b);
+                senf::hexdump( (char*) buffer , ((char*) buffer) + size , b);
                 SENF_THROW_SYSTEM_EXCEPTION("::sendto(" + b.str() + ") to " + a.str());
             }
     } while (rv<0);
index 6bb4aae..aef6bc5 100644 (file)
@@ -345,7 +345,7 @@ prefix_ senf::console::Client::Client(Server & server, ClientHandle handle)
               false),
       name_ (server.name()), reader_ (), mode_ (server.mode())
 {
-    handle_.facet<senf::TCPSocketProtocol>().nodelay();
+    handle_.facet<senf::TCPSocketProtocol>().nodelay(true);
     handle_.blocking(false);
     executor_.chroot(root());
     switch (mode_) {