// $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
#include <boost/mpl/and.hpp>
#include <boost/utility.hpp> // for enable_if
-#include "Utils/pool_alloc_mixin.hh"
+#include "../Utils/mpl.hh"
+#include "../Utils/pool_alloc_mixin.hh"
///////////////////////////////ih.p////////////////////////////////////////
struct SocketPolicyBase
{
- virtual ~SocketPolicyBase() {}
+ virtual ~SocketPolicyBase();
# define SP_Declare(x1,x2,SomePolicy) \
virtual BOOST_PP_CAT(SomePolicy,Base) const & BOOST_PP_CAT(the,SomePolicy) () \
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 BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_DEC( SENF_SOCKET_POLICIES_N ) )
# define BOOST_PP_LOCAL_MACRO(n) \
- SocketPolicy_rv<n> MakeSocketPolicy_merge_( \
+ 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,sizeof(SocketPolicy_rv<n>)> \
+ struct MakeSocketPolicy_merge<Base,Policy,n> \
{ \
typedef SocketPolicy< \
BOOST_PP_SEQ_FOR_EACH_I( SP_DeclareMakeSocketPolicy_merge_member, \
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;
};
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
{};
template<>
- struct SocketPolicy_checkcompat<sizeof(SocketPolicy_rv<1>)>
+ struct SocketPolicy_checkcompat<1>
: public boost::true_type
{};
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 ) )) >
{};
template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( SENF_SOCKET_POLICIES_N,
class T,
- senf::impl::nil ) >
+ mpl::nil ) >
class MakeSocketPolicy
: public boost::mpl::if_< boost::is_convertible< T0*, SocketPolicyBase* >,
impl::MakeSocketPolicy_impl<