Whitespce cleanup: Remove whitespace at end-on-line, remove tabs, wrap
[senf.git] / senf / PPI / MultiConnectorMixin.mpp
index 0a85d3f..0de3682 100644 (file)
@@ -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 <g0dil@berlios.de>
 // Custom includes
 #include <boost/preprocessor/iteration/iterate.hpp>
 #include <boost/preprocessor/control/if.hpp>
-#include <boost/preprocessor/facilities/empty.hpp> 
+#include <boost/preprocessor/facilities/empty.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
 #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
-#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> 
+#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
 #include <boost/type_traits/is_base_of.hpp>
 #include <boost/mpl/and.hpp>
 #include <boost/mpl/not.hpp>
-#include <senf/Utils/type_traits.hh>
+#include <boost/tuple/tuple.hpp>
 
 // ///////////////////////////mpp.p////////////////////////////////////////
 #elif BOOST_PP_IS_ITERATING // ////////////////////////////////////////////
@@ -91,15 +91,6 @@ mpp_TplParams()
 ConnectorType_ & newConnector( mpp_FnParams() );
 
 // ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==9 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi::module::MultiConnectorMixin member declaration 1..2*MAX_ARGS
-
-template <class Source, class Target mpp_TplParamsKomma()>
-static std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-connect_(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
 #elif BOOST_PP_ITERATION_FLAGS()==2 // ////////////////////////////////////
 // ////////////////////////////////////////////////////////////////////////
 // senf::ppi namespace member declaration 1..MAX_ARGS
@@ -113,7 +104,7 @@ typename boost::enable_if<
         senf::ppi::module::detail::IsMulticonnectorSource<Source>,
         boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget<Target> > >,
     typename Source::ConnectorType & >::type
-connect(Source & source, Target & target mpp_FnParamsKomma());
+connect(Source & source mpp_FnParamsKomma(), Target & target);
 
 template <class Source, class Target mpp_TplParamsKomma()>
 typename boost::enable_if<
@@ -131,32 +122,17 @@ 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 1..2*MAX_ARGS
+// senf::ppi namespace member declaration 1..MAX_ARGS x 1..MAX_ARGS
 
-template <class Source, class Target mpp_TplParamsKomma()>
+template <class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
 typename boost::enable_if<
     boost::mpl::and_<
         boost::is_base_of<connector::OutputConnector, typename Source::ConnectorType>,
         boost::is_base_of<connector::InputConnector, typename Target::ConnectorType> >,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-connect(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==4 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi namespace member declaration 1..MAX_ARGS x 1..MAX_ARGS
-
-namespace detail {
-
-template <class Fn, class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
-typename boost::enable_if_c<
-    senf::function_arity<Fn>::value == BOOST_PP_ITERATION()+1,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-connect_(Fn, Source & source, Target & target mpp_FnParamsKomma() mpp_FnParamsKomma2());
-
-}
+    boost::tuple<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
+connect(Source & source mpp_FnParamsKomma(), Target & target mpp_FnParamsKomma2());
 
 // ////////////////////////////////////////////////////////////////////////
 #elif BOOST_PP_ITERATION_FLAGS()==8 // ////////////////////////////////////
@@ -164,19 +140,10 @@ connect_(Fn, Source & source, Target & target mpp_FnParamsKomma() mpp_FnParamsKo
 // senf::ppi::module::detail::MultiConnectorMixinAccess member declaration 1..MAX_ARGS
 
 template <class Module mpp_TplParamsKomma()>
-static typename Module::ConnectorType & 
+static typename Module::ConnectorType &
 newConnector(Module & module mpp_FnParamsKomma());
 
 // ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==10 // ///////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// senf::ppi::module::detail::MultiConnectorMixinAccess member declaration 1..2*MAX_ARGS
-
-template <class Source, class Target mpp_TplParamsKomma()>
-static std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-connect(Source & source, Target & target mpp_FnParamsKomma());
-
-// ////////////////////////////////////////////////////////////////////////
 #elif BOOST_PP_ITERATION_FLAGS()==3 // ////////////////////////////////////
 // ////////////////////////////////////////////////////////////////////////
 // Implementation 1..MAX_ARGS
@@ -190,7 +157,7 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,KeyType_,ContainerType_>::
 newConnector(mpp_FnParams())
 {
-    std::auto_ptr<ConnectorType_> conn (new ConnectorType_);
+    std::auto_ptr<ConnectorType_> conn (new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     KeyType_ key (static_cast<Self_*>(this)->connectorSetup(*conn mpp_CallParamsKomma()));
     return * connectors_.insert(key, conn).first->second;
 }
@@ -204,10 +171,10 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>::
 newConnector(mpp_FnParams())
 {
-    connectors_.push_back(new ConnectorType_);
+    connectors_.push_back(new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     ConnectorType_ & conn (connectors_.back());
     try { static_cast<Self_*>(this)->connectorSetup(conn mpp_CallParamsKomma()); }
-    catch (...) { connectors_.pop_back(); throw; }
+    catch (...) { disconnected(conn); throw; }
     return conn;
 }
 
@@ -220,7 +187,7 @@ prefix_ ConnectorType_ &
 senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,void>::
 newConnector(mpp_FnParams())
 {
-    std::auto_ptr<ConnectorType_> cp (new ConnectorType_);
+    std::auto_ptr<ConnectorType_> cp (new detail::MultiConnectorWrapper<Self_,ConnectorType_>);
     ConnectorType_ & cref (*cp);
     static_cast<Self_*>(this)->connectorSetup(cp mpp_CallParamsKomma());
     return cref;
@@ -235,7 +202,7 @@ typename boost::enable_if<
         senf::ppi::module::detail::IsMulticonnectorSource<Source>,
         boost::mpl::not_< senf::ppi::module::detail::IsMulticonnectorTarget<Target> > >,
     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()));
@@ -261,7 +228,7 @@ senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
 // senf::ppi::module::detail::MultiConnectorMixinAccess members
 
 template <class Module mpp_TplParamsKomma()>
-typename Module::ConnectorType & 
+typename Module::ConnectorType &
 senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector(
     Module & module mpp_FnParamsKomma())
 {
@@ -275,94 +242,25 @@ senf::ppi::module::detail::MultiConnectorMixinAccess::newConnector(
         5 ))
 #include BOOST_PP_ITERATE()
 
+////////////////////////////////////////////////////////////////////////
+#elif BOOST_PP_ITERATION_FLAGS()==5 // ////////////////////////////////////
 // ////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==7 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// Implementation 1..2*MAX_ARGS
-
-////////////////////////////////////////
-// Map container
-
-template <class Self_, class ConnectorType_, class KeyType_, class ContainerType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,KeyType_,ContainerType_>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////
-// Vector container
-
-template <class Self_, class ConnectorType_, class ContainerType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////
-// User container
-
-template <class Self_, class ConnectorType_>
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::MultiConnectorMixin<Self_,ConnectorType_,void,void>::
-connect_(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return senf::ppi::detail::connect_(
-        & Self_::connectorSetup, source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////
-// senf::ppi::connect
+// Implementation 1..MAX_ARGS x 1..MAX_ARGS
 
-template <class Source, class Target mpp_TplParamsKomma()>
+template <class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
 typename boost::enable_if<
     boost::mpl::and_<
         boost::is_base_of<senf::ppi::connector::OutputConnector, typename Source::ConnectorType>,
         boost::is_base_of<senf::ppi::connector::InputConnector, typename Target::ConnectorType> >,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-senf::ppi::connect(Source & source, Target & target mpp_FnParamsKomma())
-{
-    return module::detail::MultiConnectorMixinAccess::connect(
-        source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////
-// senf::ppi::module::detail::MultiConnectorMixinAccess members
-
-template <class Source, class Target mpp_TplParamsKomma()>
-std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &>
-senf::ppi::module::detail::MultiConnectorMixinAccess::connect(
-    Source & source, Target & target mpp_FnParamsKomma())
-{
-    return Source::connect_(source, target mpp_CallParamsKomma());
-}
-
-////////////////////////////////////////////////////////////////////////
-#elif BOOST_PP_ITERATION_FLAGS()==5 // ////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// Implementation 1..MAX_ARGS x 1..MAX_ARGS
-
-template <class Fn, class Source, class Target mpp_TplParamsKomma() mpp_TplParamsKomma2()>
-typename boost::enable_if_c<
-    senf::function_arity<Fn>::value == BOOST_PP_ITERATION()+1,
-    std::pair<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
-senf::ppi::detail::connect_(Fn, Source & source, Target & target 
-                            mpp_FnParamsKomma() mpp_FnParamsKomma2())
+    boost::tuple<typename Source::ConnectorType &, typename Target::ConnectorType &> >::type
+senf::ppi::connect(Source & source mpp_FnParamsKomma(), Target & target 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<typename Source::ConnectorType &, typename Target::ConnectorType &>(s,t);
+    return boost::tie(s,t);
 }
 
 // ////////////////////////////////////////////////////////////////////////
@@ -382,13 +280,13 @@ senf::ppi::detail::connect_(Fn, Source & source, Target & target
 #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))))