X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FMultiConnectorMixin.mpp;h=0de3682d7a57fc3000750fa71eeb59ee2ee094ac;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=ac56abe8c61c86b61ed495a23db9472242f1d967;hpb=2d88e6b3f5a6f3906e42264f58859e6bf9c12dae;p=senf.git diff --git a/senf/PPI/MultiConnectorMixin.mpp b/senf/PPI/MultiConnectorMixin.mpp index ac56abe..0de3682 100644 --- a/senf/PPI/MultiConnectorMixin.mpp +++ b/senf/PPI/MultiConnectorMixin.mpp @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2009 +// Copyright (C) 2009 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund @@ -29,45 +29,52 @@ // Custom includes #include #include -#include +#include #include #include #include -#include +#include #include #include #include -#include +#include // ///////////////////////////mpp.p//////////////////////////////////////// #elif BOOST_PP_IS_ITERATING // //////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////// // Local Macros +// => template #define mpp_TplParams() \ - BOOST_PP_IF( \ - BOOST_PP_ITERATION(), \ - mpp_TplParams_, \ - BOOST_PP_EMPTY)() + BOOST_PP_IF(BOOST_PP_ITERATION(), mpp_TplParams_, BOOST_PP_EMPTY)() #define mpp_TplParams_() \ template - + +// => , class A0, class A1, ... #define mpp_TplParamsKomma() \ BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), class A) + +// => A0 const & a0, A1 const & a1, ... #define mpp_FnParams() \ BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), A, const & a) + +// => , A0 const & a0, A1 const & a1, ... #define mpp_FnParamsKomma() \ BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_ITERATION(), A, const & a) + +// => a0, a1, ... #define mpp_CallParams() \ BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), a) + +// => , a0, a1, ... #define mpp_CallParamsKomma() \ BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), a) -// Same as above but for outer loop in nested loops +// Same as above but for outer iteration (in nested file iteration) #define mpp_TplParamsKomma2() \ BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_FRAME_ITERATION(1), class B) #define mpp_FnParams2() \ - BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, const & a) + BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, cont & b) #define mpp_FnParamsKomma2() \ BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_FRAME_ITERATION(1), B, const & b) #define mpp_CallParams2() \ @@ -78,24 +85,15 @@ // //////////////////////////////////////////////////////////////////////// #if BOOST_PP_ITERATION_FLAGS()==1 // ////////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// MultiConnectorMixin member declaration +// senf::ppi::module::MultiConnectorMixin member declaration 1..MAX_ARGS mpp_TplParams() ConnectorType_ & newConnector( mpp_FnParams() ); // //////////////////////////////////////////////////////////////////////// -#elif BOOST_PP_ITERATION_FLAGS()==9 // ////////////////////////////////////// -// //////////////////////////////////////////////////////////////////////// -// MultiConnectorMixin member declaration - -template -static std::pair -connect_(Source & source, Target & target mpp_FnParamsKomma()); - -// //////////////////////////////////////////////////////////////////////// #elif BOOST_PP_ITERATION_FLAGS()==2 // //////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// senf::ppi namespace member declaration +// senf::ppi namespace member declaration 1..MAX_ARGS // Here the reference to Source::ConnectorType / Target::ConnectorType // works like enable_if, since only MultiConnector modules have those members @@ -103,16 +101,16 @@ connect_(Source & source, Target & target mpp_FnParamsKomma()); template typename boost::enable_if< boost::mpl::and_< - senf::ppi::module::detail::is_multiconnector_source, - boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_target > >, + senf::ppi::module::detail::IsMulticonnectorSource, + boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget > >, typename Source::ConnectorType & >::type -connect(Source & source, Target & target mpp_FnParamsKomma()); +connect(Source & source mpp_FnParamsKomma(), Target & target); template typename boost::enable_if< boost::mpl::and_< - boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_source >, - senf::ppi::module::detail::is_multiconnector_target >, + boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorSource >, + senf::ppi::module::detail::IsMulticonnectorTarget >, typename Target::ConnectorType & >::type connect(Source & source, Target & target mpp_FnParamsKomma()); @@ -124,37 +122,31 @@ connect(Source & source, Target & target mpp_FnParamsKomma()); #include BOOST_PP_ITERATE() // //////////////////////////////////////////////////////////////////////// -#elif BOOST_PP_ITERATION_FLAGS()==6 // //////////////////////////////////// +#elif BOOST_PP_ITERATION_FLAGS()==4 // //////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// senf::ppi namespace member declaration (nested) +// senf::ppi namespace member declaration 1..MAX_ARGS x 1..MAX_ARGS -template +template typename boost::enable_if< boost::mpl::and_< boost::is_base_of, boost::is_base_of >, - std::pair >::type -connect(Source & source, Target & target mpp_FnParamsKomma()); + boost::tuple >::type +connect(Source & source mpp_FnParamsKomma(), Target & target mpp_FnParamsKomma2()); // //////////////////////////////////////////////////////////////////////// -#elif BOOST_PP_ITERATION_FLAGS()==4 // //////////////////////////////////// +#elif BOOST_PP_ITERATION_FLAGS()==8 // //////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// senf::ppi::detail namespace member declaration (nested iteration) - -namespace detail { - -template -typename boost::enable_if_c< - senf::function_arity::value == BOOST_PP_ITERATION()+1, - std::pair >::type -connect_(Fn, Source & source, Target & target mpp_FnParamsKomma() mpp_FnParamsKomma2()); +// senf::ppi::module::detail::MultiConnectorMixinAccess member declaration 1..MAX_ARGS -} +template +static typename Module::ConnectorType & +newConnector(Module & module mpp_FnParamsKomma()); // //////////////////////////////////////////////////////////////////////// #elif BOOST_PP_ITERATION_FLAGS()==3 // //////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// Implementation +// Implementation 1..MAX_ARGS //////////////////////////////////////// // Map container @@ -165,7 +157,7 @@ prefix_ ConnectorType_ & senf::ppi::module::MultiConnectorMixin:: newConnector(mpp_FnParams()) { - std::auto_ptr conn (new ConnectorType_); + std::auto_ptr conn (new detail::MultiConnectorWrapper); KeyType_ key (static_cast(this)->connectorSetup(*conn mpp_CallParamsKomma())); return * connectors_.insert(key, conn).first->second; } @@ -179,10 +171,10 @@ prefix_ ConnectorType_ & senf::ppi::module::MultiConnectorMixin:: newConnector(mpp_FnParams()) { - connectors_.push_back(new ConnectorType_); + connectors_.push_back(new detail::MultiConnectorWrapper); ConnectorType_ & conn (connectors_.back()); try { static_cast(this)->connectorSetup(conn mpp_CallParamsKomma()); } - catch (...) { connectors_.pop_back(); throw; } + catch (...) { disconnected(conn); throw; } return conn; } @@ -195,41 +187,22 @@ prefix_ ConnectorType_ & senf::ppi::module::MultiConnectorMixin:: newConnector(mpp_FnParams()) { - std::auto_ptr cp (new ConnectorType_); + std::auto_ptr cp (new detail::MultiConnectorWrapper); ConnectorType_ & cref (*cp); static_cast(this)->connectorSetup(cp mpp_CallParamsKomma()); return cref; } //////////////////////////////////////// -// senf::ppi::module::detail::MultiConnectorMixinAccess members - -template -typename Module::ConnectorType & -senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector( - Module & module mpp_FnParamsKomma()) -{ - return module.newConnector(mpp_CallParams()); -} - -template -std::pair -senf::ppi::module::detail::MultiConnectorMixinAccess::connect( - Source & source, Target & target mpp_FnParamsKomma()) -{ - return Source::connect_(source, target mpp_CallParamsKomma()); -} - -//////////////////////////////////////// // senf::ppi::connect template typename boost::enable_if< boost::mpl::and_< - senf::ppi::module::detail::is_multiconnector_source, - boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_target > >, + senf::ppi::module::detail::IsMulticonnectorSource, + boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget > >, typename Source::ConnectorType & >::type -senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) +senf::ppi::connect(Source & source mpp_FnParamsKomma(), Target & target) { typename Source::ConnectorType & c ( module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma())); @@ -240,8 +213,8 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) template typename boost::enable_if< boost::mpl::and_< - boost::mpl::not_< senf::ppi::module::detail::is_multiconnector_source >, - senf::ppi::module::detail::is_multiconnector_target >, + boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorSource >, + senf::ppi::module::detail::IsMulticonnectorTarget >, typename Target::ConnectorType & >::type senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) { @@ -251,6 +224,17 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) return c; } +//////////////////////////////////////// +// senf::ppi::module::detail::MultiConnectorMixinAccess members + +template +typename Module::ConnectorType & +senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector( + Module & module mpp_FnParamsKomma()) +{ + return module.newConnector(mpp_CallParams()); +} + #define BOOST_PP_ITERATION_PARAMS_2 (4, (\ 0, \ SENF_MULTI_CONNECTOR_MAX_ARGS, \ @@ -258,87 +242,28 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) 5 )) #include BOOST_PP_ITERATE() -// //////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// #elif BOOST_PP_ITERATION_FLAGS()==5 // //////////////////////////////////// // //////////////////////////////////////////////////////////////////////// -// Implementation for nested iteration - -template -typename boost::enable_if_c< - senf::function_arity::value == BOOST_PP_ITERATION()+1, - std::pair >::type -senf::ppi::detail::connect_(Fn, Source & source, Target & target - mpp_FnParamsKomma() mpp_FnParamsKomma2()) -{ - typename Source::ConnectorType & s ( - module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma())); - typename Target::ConnectorType & t ( - module::detail::MultiConnectorMixinAccess::newConnector(target mpp_CallParamsKomma2())); - connect(s,t); - return std::pair(s,t); -} - -// //////////////////////////////////////////////////////////////////////// -#elif BOOST_PP_ITERATION_FLAGS()==7 // //////////////////////////////////// -// //////////////////////////////////////////////////////////////////////// -// Implementation - -template -template -std::pair -senf::ppi::module::MultiConnectorMixin:: -connect_(Source & source, Target & target mpp_FnParamsKomma()) -{ - return senf::ppi::detail::connect_( - & Self_::connectorSetup, source, target mpp_CallParamsKomma()); -} - -template -template -std::pair -senf::ppi::module::MultiConnectorMixin:: -connect_(Source & source, Target & target mpp_FnParamsKomma()) -{ - return senf::ppi::detail::connect_( - & Self_::connectorSetup, source, target mpp_CallParamsKomma()); -} +// Implementation 1..MAX_ARGS x 1..MAX_ARGS -template -template -std::pair -senf::ppi::module::MultiConnectorMixin:: -connect_(Source & source, Target & target mpp_FnParamsKomma()) -{ - return senf::ppi::detail::connect_( - & Self_::connectorSetup, source, target mpp_CallParamsKomma()); -} - -template +template typename boost::enable_if< boost::mpl::and_< boost::is_base_of, boost::is_base_of >, - std::pair >::type -senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma()) + boost::tuple >::type +senf::ppi::connect(Source & source mpp_FnParamsKomma(), Target & target mpp_FnParamsKomma2()) { - return module::detail::MultiConnectorMixinAccess::connect( - source, target mpp_CallParamsKomma()); + typename Source::ConnectorType & s ( + module::detail::MultiConnectorMixinAccess::newConnector(source mpp_CallParamsKomma())); + typename Target::ConnectorType & t ( + module::detail::MultiConnectorMixinAccess::newConnector(target mpp_CallParamsKomma2())); + connect(s,t); + return boost::tie(s,t); } // //////////////////////////////////////////////////////////////////////// -#elif BOOST_PP_ITERATION_FLAGS()==8 // //////////////////////////////////// -// //////////////////////////////////////////////////////////////////////// -// senf::ppi::module::detail::MultiConnectorMixinAccess members - -template -static typename Module::ConnectorType & -newConnector(Module & module mpp_FnParamsKomma()); - -template -static std::pair -connect(Source & source, Target & target mpp_FnParamsKomma()); - -// //////////////////////////////////////////////////////////////////////// #endif // ///////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////// // Undefine local Macros @@ -355,13 +280,13 @@ connect(Source & source, Target & target mpp_FnParamsKomma()); #undef mpp_TplParamsKomma #undef mpp_TplParams_ #undef mpp_TplParams - + // //////////////////////////////////////////////////////////////////////// /* (save-excursion (re-search-backward "^// Undefine local Macros") (forward-line 1) (delete-region (point) (progn (search-forward "// ////") (forward-line -1) (point))) (insert "\n") (let ((b (point)) - (e (progn (insert (save-excursion (re-search-backward + (e (progn (insert (save-excursion (re-search-backward "^// Local Macros") (search-forward "#define") (beginning-of-line) (buffer-substring (point) (progn (search-forward "// ////") (search-backward "#define") (forward-line 1) (point))))) (point))))