NEW FILE HEADER / COPYRIGHT FORMAT
[senf.git] / Socket / SocketPolicy.ih
index 3f0b8cc..1d51ba3 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
 // Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS) 
+// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+//     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -50,6 +50,9 @@
 #include <boost/mpl/and.hpp>
 #include <boost/utility.hpp> // for enable_if
 
+#include "../Utils/mpl.hh"
+#include "../Utils/pool_alloc_mixin.hh"
+
 ///////////////////////////////ih.p////////////////////////////////////////
 
 /// \cond disabled
@@ -59,7 +62,7 @@ namespace senf {
 
 #   define SENF_SOCKET_POLICIES_N BOOST_PP_SEQ_SIZE( SENF_SOCKET_POLICIES )
 
-#   define SP_DeclareAlias(x1,x2,SomePolicy)                                             \
+#   define SP_DeclareAlias(x1,x2,SomePolicy)                                                      \
         typedef BOOST_PP_CAT(SomePolicy,Base) BOOST_PP_CAT(Unspecified,SomePolicy);
 
     BOOST_PP_SEQ_FOR_EACH( SP_DeclareAlias, , SENF_SOCKET_POLICIES )
@@ -70,26 +73,31 @@ namespace senf {
     {
         virtual ~SocketPolicyBase() {}
 
-#       define SP_Declare(x1,x2,SomePolicy)                                                     \
-            virtual BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) () const = 0;
+#       define SP_Declare(x1,x2,SomePolicy)                                                       \
+            virtual BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) ()         \
+                const = 0;
 
         BOOST_PP_SEQ_FOR_EACH( SP_Declare, , SENF_SOCKET_POLICIES )
 
 #       undef SP_Declare
     };
 
-#   define SP_TemplateArgs(x1,x2,n,SomePolicy)                                  \
-        BOOST_PP_COMMA_IF( n )                                                  \
+#   define SP_TemplateArgs(x1,x2,n,SomePolicy)                                                    \
+        BOOST_PP_COMMA_IF( n )                                                                    \
         class BOOST_PP_CAT(SomePolicy,_) = BOOST_PP_CAT(SomePolicy,Base)
+#   define SP_TemplateParms(x1,x2,n,SomePolicy)                                                   \
+        BOOST_PP_COMMA_IF( n ) BOOST_PP_CAT(SomePolicy,_)
 
     template < BOOST_PP_SEQ_FOR_EACH_I( SP_TemplateArgs, , SENF_SOCKET_POLICIES ) >
     struct SocketPolicy
-        : public SocketPolicyBase
+        : public SocketPolicyBase,
+          public senf::pool_alloc_mixin< 
+              SocketPolicy< BOOST_PP_SEQ_FOR_EACH_I( SP_TemplateParms, , SENF_SOCKET_POLICIES ) > >
     {
-#   define SP_DeclarePolicyMember(x1,x2,SomePolicy)                                     \
-        typedef BOOST_PP_CAT(SomePolicy,_) SomePolicy;                                  \
-        SomePolicy BOOST_PP_CAT(BOOST_PP_CAT(the,SomePolicy),_);                        \
-        BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) () const     \
+#   define SP_DeclarePolicyMember(x1,x2,SomePolicy)                                               \
+        typedef BOOST_PP_CAT(SomePolicy,_) SomePolicy;                                            \
+        SomePolicy BOOST_PP_CAT(BOOST_PP_CAT(the,SomePolicy),_);                                  \
+        BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) () const               \
             { return BOOST_PP_CAT(BOOST_PP_CAT(the,SomePolicy),_); }
 
         BOOST_PP_SEQ_FOR_EACH( SP_DeclarePolicyMember, , SENF_SOCKET_POLICIES )
@@ -99,33 +107,31 @@ namespace senf {
     };
 
 #   undef SP_TemplateArgs
+#   undef SP_TemplateParms
 
 namespace impl {
 
-    struct nil {};
-
-    template <int N>
-    struct SocketPolicy_rv
-    { int v[N+1]; };
-
-    template <class Base, class Policy, int N>
+    template <class Base, class Policy, int _>
     struct MakeSocketPolicy_merge
     {};
 
-#   define SP_DeclareMakeSocketPolicy_merge_member(r,n,m,SomePolicy)            \
-        BOOST_PP_COMMA_IF( m )                                                  \
+#   define SP_DeclareMakeSocketPolicy_merge_member(r,n,m,SomePolicy)                              \
+        BOOST_PP_COMMA_IF( m )                                                                    \
         BOOST_PP_IIF( BOOST_PP_EQUAL(n,m), Policy, typename Base::SomePolicy )
 
 #    define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_DEC( SENF_SOCKET_POLICIES_N ) )
-#    define BOOST_PP_LOCAL_MACRO(n)                                                                                     \
-        SocketPolicy_rv<n> MakeSocketPolicy_merge_(BOOST_PP_CAT( BOOST_PP_SEQ_ELEM( n, SENF_SOCKET_POLICIES ),Base)*);  \
-                                                                                                                        \
-        template <class Base, class Policy>                                                                             \
-        struct MakeSocketPolicy_merge<Base,Policy,sizeof(SocketPolicy_rv<n>)>                                           \
-        {                                                                                                               \
-            typedef SocketPolicy<                                                                                       \
-               BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareMakeSocketPolicy_merge_member, n, SENF_SOCKET_POLICIES )              \
-               > type;                                                                                                  \
+#    define BOOST_PP_LOCAL_MACRO(n)                                                               \
+        senf::mpl::rv<n> MakeSocketPolicy_merge_(                                                 \
+            BOOST_PP_CAT( BOOST_PP_SEQ_ELEM( n, SENF_SOCKET_POLICIES ),Base)*);                   \
+                                                                                                  \
+        template <class Base, class Policy>                                                       \
+        struct MakeSocketPolicy_merge<Base,Policy,n>                                              \
+        {                                                                                         \
+            typedef SocketPolicy<                                                                 \
+               BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareMakeSocketPolicy_merge_member,                  \
+                                        n,                                                        \
+                                        SENF_SOCKET_POLICIES )                                    \
+               > type;                                                                            \
         };
 
 #   include BOOST_PP_LOCAL_ITERATE()
@@ -138,11 +144,11 @@ namespace impl {
         struct apply
             : MakeSocketPolicy_merge<Base,
                                      Policy,
-                                     sizeof(MakeSocketPolicy_merge_(static_cast<Policy*>(0)))>
+                                     SENF_MPL_RV(MakeSocketPolicy_merge_(static_cast<Policy*>(0)))>
         {};
 
         template <class Base>
-        struct apply<Base,nil>
+        struct apply<Base,mpl::nil>
         {
             typedef Base type;
         };
@@ -154,18 +160,18 @@ namespace impl {
         typedef typename boost::mpl::fold< Vector, Base, MakeSocketPolicy_fold >::type policy;
     };
 
-#   define SP_DeclareArguments(x1,x2,n,SomePolicy)      \
-        BOOST_PP_COMMA_IF( n )                          \
+#   define SP_DeclareArguments(x1,x2,n,SomePolicy)                                                \
+        BOOST_PP_COMMA_IF( n )                                                                    \
         typename Base::SomePolicy *
 
     template <class Base>
-    SocketPolicy_rv<1> SocketPolicy_checkcompat_(
+    senf::mpl::rv<1> SocketPolicy_checkcompat_(
         BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SENF_SOCKET_POLICIES ) );
 
 #   undef SP_DeclareArguments
 
     template <class Base>
-    SocketPolicy_rv<2> SocketPolicy_checkcompat_( ... );
+    senf::mpl::rv<2> SocketPolicy_checkcompat_( ... );
 
     template <int Size>
     struct SocketPolicy_checkcompat
@@ -173,54 +179,65 @@ namespace impl {
     {};
 
     template<>
-    struct SocketPolicy_checkcompat<sizeof(SocketPolicy_rv<1>)>
+    struct SocketPolicy_checkcompat<1>
         : public boost::true_type
     {};
 
 
-#   define SP_DeclareArguments(x1,x2,n,SomePolicy)      \
-        BOOST_PP_COMMA_IF( n )                          \
+#   define SP_DeclareArguments(x1,x2,n,SomePolicy)                                                \
+        BOOST_PP_COMMA_IF( n )                                                                    \
         static_cast<typename Derived::SomePolicy *>(0)
 
     template <class Base, class Derived>
     struct SocketPolicy_compatibility
-        : public SocketPolicy_checkcompat< sizeof(
+        : public SocketPolicy_checkcompat< SENF_MPL_RV(
             SocketPolicy_checkcompat_<Base>(
                 BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SENF_SOCKET_POLICIES ) )) >
     {};
 
 } // namespace impl
 
-    template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( SENF_SOCKET_POLICIES_N, class T, senf::impl::nil ) >
+    template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( SENF_SOCKET_POLICIES_N, 
+                                                    class T, 
+                                                    mpl::nil ) >
     class MakeSocketPolicy
         : public boost::mpl::if_< boost::is_convertible< T0*, SocketPolicyBase* >,
-                                  impl::MakeSocketPolicy_impl< T0, boost::mpl::vector< BOOST_PP_ENUM_SHIFTED_PARAMS( SENF_SOCKET_POLICIES_N, T ) > >,
-                                  impl::MakeSocketPolicy_impl< SocketPolicy<>,
-                                                               boost::mpl::vector< BOOST_PP_ENUM_PARAMS( SENF_SOCKET_POLICIES_N, T ) > > >::type
+                                  impl::MakeSocketPolicy_impl< 
+                                      T0, 
+                                      boost::mpl::vector< 
+                                          BOOST_PP_ENUM_SHIFTED_PARAMS( 
+                                              SENF_SOCKET_POLICIES_N, T ) > >,
+                                  impl::MakeSocketPolicy_impl< 
+                                      SocketPolicy<>,
+                                      boost::mpl::vector< 
+                                          BOOST_PP_ENUM_PARAMS( 
+                                              SENF_SOCKET_POLICIES_N, T ) > > >::type
     {};
 
     template <class BasePolicy, class DerivedPolicy>
     struct SocketPolicyIsBaseOf
-        : public boost::mpl::if_< boost::mpl::and_< boost::is_convertible< BasePolicy*, SocketPolicyBase* >,
-                                                    boost::is_convertible< DerivedPolicy*, SocketPolicyBase* > >,
-                                  impl::SocketPolicy_compatibility<BasePolicy,DerivedPolicy>,
-                                  boost::false_type >::type
+        : public boost::mpl::if_< 
+              boost::mpl::and_< boost::is_convertible< BasePolicy*, SocketPolicyBase* >,
+                                boost::is_convertible< DerivedPolicy*, SocketPolicyBase* > >,
+              impl::SocketPolicy_compatibility<BasePolicy,DerivedPolicy>,
+              boost::false_type 
+          >::type
     {};
 
-#   define SP_DefineConditions(x1,x2,SomePolicy)                                                \
-        template <class Policy, class Trait>                                                    \
-        struct BOOST_PP_CAT(SomePolicy,Is)                                                      \
-            : public boost::is_convertible< typename Policy::SomePolicy*, Trait* >              \
-        {};                                                                                     \
-                                                                                                \
-        template <class Policy, class Trait>                                                    \
-        struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),Is)                                     \
-            : public boost::enable_if< BOOST_PP_CAT(SomePolicy,Is)<Policy,Trait> >              \
-        {};                                                                                     \
-                                                                                                \
-        template <class Policy, class Trait>                                                    \
-        struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),IsNot)                                  \
-            : public boost::enable_if_c< ! BOOST_PP_CAT(SomePolicy,Is)<Policy,Trait>::value >   \
+#   define SP_DefineConditions(x1,x2,SomePolicy)                                                  \
+        template <class Policy, class Trait>                                                      \
+        struct BOOST_PP_CAT(SomePolicy,Is)                                                        \
+            : public boost::is_convertible< typename Policy::SomePolicy*, Trait* >                \
+        {};                                                                                       \
+                                                                                                  \
+        template <class Policy, class Trait>                                                      \
+        struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),Is)                                       \
+            : public boost::enable_if< BOOST_PP_CAT(SomePolicy,Is)<Policy,Trait> >                \
+        {};                                                                                       \
+                                                                                                  \
+        template <class Policy, class Trait>                                                      \
+        struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),IsNot)                                    \
+            : public boost::enable_if_c< ! BOOST_PP_CAT(SomePolicy,Is)<Policy,Trait>::value >     \
         {};
 
     BOOST_PP_SEQ_FOR_EACH( SP_DefineConditions, , SENF_SOCKET_POLICIES )
@@ -242,4 +259,5 @@ namespace impl {
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
 // compile-command: "scons -u test"
+// comment-column: 40
 // End: