moved statistics classes from NetEmu to SENF
[senf.git] / Socket / Protocols / BSDSocketAddress.hh
index 61cb220..ec3edfd 100644 (file)
 /** \file
     \brief BSDSocketAddress public header */
 
-#ifndef HH_BSDSocketAddress_
-#define HH_BSDSocketAddress_ 1
+#ifndef HH_SENF_Socket_Protocols_BSDSocketAddress_
+#define HH_SENF_Socket_Protocols_BSDSocketAddress_ 1
 
 // Custom includes
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/type_traits/type_with_alignment.hpp>
 #include "../../Utils/safe_bool.hh"
 #include <sys/socket.h>
 #include <iostream>
@@ -50,6 +52,20 @@ namespace senf {
         It is \e not possible to create or store BSDSocketAddress instances: You must either store
         an address in one of the specifically typed subclasses or using GenericBSDSocketAddress.
 
+        A BSDSocketAddress or GenericBSDSocketAddress can be cast (like a downcast) to (the correct)
+        type specific cast using sockaddr_cast:
+
+        \code
+        void foo(senf::BSDSOcketAddress const & addr)
+        {
+            if (addr.family() == senf::INet4SocketAddress::addressFamily) {
+                senf::INet4SocketAddress i4addr (
+                    senf::sockaddr_cast<senf::INet4SocketAddress>(addr) );
+                ...
+            }
+        }
+        \endcode
+        
         All these classes provide a generic \c sockaddr API to interface with legacy \c sockaddr
         based code (e.g. the BSD socket API). In this base-class, this interface is read-only, the
         derived classes however provide a read-write interface.
@@ -98,8 +114,16 @@ namespace senf {
         void socklen(socklen_t len);
 
     private:
-
-        socklen_t len_;
+        
+        // The following incantation is needed to fix the alignment of the sockaddr data members
+        // which will be added by the derived classes later: The alignment must be forced
+        // to coincide with the struct sockaddr_storage alignment (which must have the largest
+        // alignment of all sockaddr types).
+        union {
+            socklen_t len_;
+            boost::type_with_alignment<boost::alignment_of<struct sockaddr_storage>::value> a_;
+            char _b[boost::alignment_of<struct sockaddr_storage>::value];
+        };
     };
 
     /** \brief Safe socket address down-cast