X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FSocketPolicy.ih;h=b3352803e34788b596f86ff284e94a198c986e8f;hb=3863d46dd898b7bc35ea8c6ccd8563b18762a6b6;hp=b60fd941a0d05aaaa7f8435bc13f22cf08f9afc8;hpb=b2d64a4084a053f0887c7845bb81074e0cd3a855;p=senf.git diff --git a/Socket/SocketPolicy.ih b/Socket/SocketPolicy.ih index b60fd94..b335280 100644 --- a/Socket/SocketPolicy.ih +++ b/Socket/SocketPolicy.ih @@ -1,9 +1,9 @@ // $Id$ // -// Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Copyright (C) 2006 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // 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 @@ -20,8 +20,12 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef IH_SocketPolicy_ -#define IH_SocketPolicy_ 1 +/** \file + \brief Policy Framework internal header + */ + +#ifndef IH_SENF_Socket_SocketPolicy_ +#define IH_SENF_Socket_SocketPolicy_ 1 // Custom includes #include @@ -46,99 +50,88 @@ #include #include // for enable_if -#include "GenericSockAddr.hh" +#include "../Utils/mpl.hh" +#include "../Utils/pool_alloc_mixin.hh" ///////////////////////////////ih.p//////////////////////////////////////// -namespace satcom { -namespace lib { +/// \cond disabled +// Hide this code from doxygen -# define SATLIB_SOCKET_POLICIES_N BOOST_PP_SEQ_SIZE( SATLIB_SOCKET_POLICIES ) - - // This REALLY is bad ... but we just need an Address member in - // AddressingPolicyBase as long as ClientSocketHandle / - // ServerSocketHandle don't make use of enable_if for each and - // every member they define ... +namespace senf { - struct AddressingPolicyBase - { - virtual ~ AddressingPolicyBase() {} - - typedef GenericSockAddr Address; - }; +# define SENF_SOCKET_POLICIES_N BOOST_PP_SEQ_SIZE( SENF_SOCKET_POLICIES ) -# define SP_DeclareBase(x1,x2,SomePolicy) \ - struct BOOST_PP_CAT(SomePolicy,Base) \ - { virtual ~ BOOST_PP_CAT(SomePolicy,Base) () {} }; \ +# define SP_DeclareAlias(x1,x2,SomePolicy) \ typedef BOOST_PP_CAT(SomePolicy,Base) BOOST_PP_CAT(Unspecified,SomePolicy); - BOOST_PP_SEQ_FOR_EACH( SP_DeclareBase, , BOOST_PP_SEQ_POP_FRONT( SATLIB_SOCKET_POLICIES ) ) + BOOST_PP_SEQ_FOR_EACH( SP_DeclareAlias, , SENF_SOCKET_POLICIES ) + +# undef SP_DeclareAlias -# undef SP_DeclareBase - struct SocketPolicyBase { - virtual ~SocketPolicyBase() {} + virtual ~SocketPolicyBase(); -# define SP_DeclareTypedef(x1,x2,SomePolicy) \ - typedef BOOST_PP_CAT(SomePolicy,Base) SomePolicy; \ - BOOST_PP_CAT(SomePolicy,Base) BOOST_PP_CAT(BOOST_PP_CAT(the,SomePolicy),_); \ - virtual BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) () const \ - { return BOOST_PP_CAT(BOOST_PP_CAT(the,SomePolicy),_); } +# 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_DeclareTypedef, , SATLIB_SOCKET_POLICIES ) + BOOST_PP_SEQ_FOR_EACH( SP_Declare, , SENF_SOCKET_POLICIES ) -# undef SP_DeclareTypedef +# 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, , SATLIB_SOCKET_POLICIES ) > + 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, , SATLIB_SOCKET_POLICIES ) + BOOST_PP_SEQ_FOR_EACH( SP_DeclarePolicyMember, , SENF_SOCKET_POLICIES ) # undef SP_DeclarePolicyMember static void checkBaseOf(SocketPolicyBase const & other); }; # undef SP_TemplateArgs +# undef SP_TemplateParms namespace impl { - struct nil {}; - - template - struct SocketPolicy_rv - { int v[N+1]; }; - - template + template 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( SATLIB_SOCKET_POLICIES_N ) ) -# define BOOST_PP_LOCAL_MACRO(n) \ - SocketPolicy_rv MakeSocketPolicy_merge_(BOOST_PP_CAT( BOOST_PP_SEQ_ELEM( n, SATLIB_SOCKET_POLICIES ),Base)*); \ - \ - template \ - struct MakeSocketPolicy_merge)> \ - { \ - typedef SocketPolicy< \ - BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareMakeSocketPolicy_merge_member, n, SATLIB_SOCKET_POLICIES ) \ - > type; \ +# define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_DEC( SENF_SOCKET_POLICIES_N ) ) +# define BOOST_PP_LOCAL_MACRO(n) \ + senf::mpl::rv MakeSocketPolicy_merge_( \ + BOOST_PP_CAT( BOOST_PP_SEQ_ELEM( n, SENF_SOCKET_POLICIES ),Base)*); \ + \ + template \ + struct MakeSocketPolicy_merge \ + { \ + typedef SocketPolicy< \ + BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareMakeSocketPolicy_merge_member, \ + n, \ + SENF_SOCKET_POLICIES ) \ + > type; \ }; # include BOOST_PP_LOCAL_ITERATE() @@ -151,11 +144,11 @@ namespace impl { struct apply : MakeSocketPolicy_merge(0)))> + SENF_MPL_RV(MakeSocketPolicy_merge_(static_cast(0)))> {}; template - struct apply + struct apply { typedef Base type; }; @@ -167,19 +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 ) \ - typename Base::SomePolicy * +# define SP_DeclareArguments(x1,x2,n,SomePolicy) \ + BOOST_PP_COMMA_IF( n ) \ + typename Base::SomePolicy * template - SocketPolicy_rv<1> SocketPolicy_checkcompat_( - BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SATLIB_SOCKET_POLICIES ) ); + senf::mpl::rv<1> SocketPolicy_checkcompat_( + BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SENF_SOCKET_POLICIES ) ); # undef SP_DeclareArguments template - SocketPolicy_rv<2> SocketPolicy_checkcompat_( - BOOST_PP_ENUM_PARAMS( SATLIB_SOCKET_POLICIES_N, void * BOOST_PP_INTERCEPT ) ); + senf::mpl::rv<2> SocketPolicy_checkcompat_( ... ); template struct SocketPolicy_checkcompat @@ -187,61 +179,74 @@ namespace impl { {}; template<> - struct SocketPolicy_checkcompat)> + 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(0) template struct SocketPolicy_compatibility - : public SocketPolicy_checkcompat< sizeof( + : public SocketPolicy_checkcompat< SENF_MPL_RV( SocketPolicy_checkcompat_( - BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SATLIB_SOCKET_POLICIES ) )) > + BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareArguments, , SENF_SOCKET_POLICIES ) )) > {}; } // namespace impl - template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( SATLIB_SOCKET_POLICIES_N, class T, satcom::lib::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( SATLIB_SOCKET_POLICIES_N, T ) > >, - impl::MakeSocketPolicy_impl< SocketPolicy<>, - boost::mpl::vector< BOOST_PP_ENUM_PARAMS( SATLIB_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 struct SocketPolicyIsBaseOf - : public boost::mpl::if_< boost::mpl::and_< boost::is_convertible< BasePolicy*, SocketPolicyBase* >, - boost::is_convertible< DerivedPolicy*, SocketPolicyBase* > >, - impl::SocketPolicy_compatibility, - boost::false_type >::type + : public boost::mpl::if_< + boost::mpl::and_< boost::is_convertible< BasePolicy*, SocketPolicyBase* >, + boost::is_convertible< DerivedPolicy*, SocketPolicyBase* > >, + impl::SocketPolicy_compatibility, + boost::false_type + >::type {}; -# define SP_DefineConditions(x1,x2,SomePolicy) \ - template \ - struct BOOST_PP_CAT(SomePolicy,Is) \ - : public boost::is_convertible< typename Policy::SomePolicy*, Trait* > \ - {}; \ - \ - template \ - struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),Is) \ - : public boost::enable_if< BOOST_PP_CAT(SomePolicy,Is) > \ - {}; \ - \ - template \ - struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),IsNot) \ - : public boost::enable_if_c< ! BOOST_PP_CAT(SomePolicy,Is)::value > \ +# define SP_DefineConditions(x1,x2,SomePolicy) \ + template \ + struct BOOST_PP_CAT(SomePolicy,Is) \ + : public boost::is_convertible< typename Policy::SomePolicy*, Trait* > \ + {}; \ + \ + template \ + struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),Is) \ + : public boost::enable_if< BOOST_PP_CAT(SomePolicy,Is) > \ + {}; \ + \ + template \ + struct BOOST_PP_CAT(BOOST_PP_CAT(If,SomePolicy),IsNot) \ + : public boost::enable_if_c< ! BOOST_PP_CAT(SomePolicy,Is)::value > \ {}; - BOOST_PP_SEQ_FOR_EACH( SP_DefineConditions, , SATLIB_SOCKET_POLICIES ) + BOOST_PP_SEQ_FOR_EACH( SP_DefineConditions, , SENF_SOCKET_POLICIES ) # undef SP_DefineConditions -}} +} + +/// \endcond ///////////////////////////////ih.e//////////////////////////////////////// #endif @@ -249,5 +254,10 @@ namespace impl { // Local Variables: // mode: c++ -// c-file-style: "satcom" +// fill-column: 100 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: