// $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>
namespace senf {
namespace ppi {
-
+
#ifdef DOXYGEN
// For exposition only.
template <class MultiConnectorSource, class Target, class A1>
MultiConnectorSource::ConnectorType & connect(
MultiConnectorSource & source, A1 const & a1, Target & target);
-
+
/** \brief Connect arbitrary source to MultiConnector target
Additional implementations with 0..SENF_MULTI_CONNECTOR_MAX_ARGS arguments.
namespace detail { class MultiConnectorMixinAccess; }
- /** \brief Multi connector management
+ /** \brief Multi-Connector management
This mixin provides a module with support for a runtime configurable number of input or
output connectors.
\code
- class MyModule
- : public senf::ppi::module::Modulem,
+ class MyModule
+ : public senf::ppi::module::Module,
public senf::ppi::module::MultiConnectorMixin<
MyModule, senf::ppi::connector::ActiveInput<> >
{
route(input, output);
input.onThrottle(&MyModule::doThrottle);
}
-
+
// Optional
void connectorDestroy(senf::ppi::connector::ActiveInput const & input)
{
}
void doThrottle()
- {
+ {
// ...
}
friend class senf::ppi::module::MultiConnectorMixin<
- MyModule, senf::ppi::connector::ActiveInput<> >
+ MyModule, senf::ppi::connector::ActiveInput<> >;
}
\endcode
allocate a new connector
\code
MyModule muModule;
-
+
senf::ppi::connect(someModule, myModule);
\endcode
Some modules will expect additional arguments to be passed (see below)
\par "Advanced note:" These additional arguments are always passed by const-reference. If
you need to pass a non-const reference, declare the \c connectorSetup() argument as
non-const reference and wrap the real argument using \c boost::ref() (The reason for
- this is known as 'The forwarding problem'
+ this is known as 'The forwarding problem').
\section senf_ppi_multiconnector_advanced Advanced usage: Managing your own container
Implementing \c connectorDestroy now is \e mandatory. The signature is changed to take a
pointer as argument
\code
- class MyModule
+ class MyModule
: public senf::ppi::module::Module,
public senf::ppi::module::MultiConnectorMixin<
MyModule, senf::ppi::connector::ActiveInput<>, void, void >
successfully, otherwise your code will break.
*/
- template <class Self_,
- class ConnectorType_,
- class KeyType_=void,
+ template <class Self_,
+ class ConnectorType_,
+ class KeyType_=void,
class ContainerType_=typename detail::MultiConnectorDefaultContainer<
KeyType_,ConnectorType_>::type>
- class MultiConnectorMixin
+ class MultiConnectorMixin
: private detail::MultiConnectorSelectBase<ConnectorType_>::type
{
public:
friend class detail::MultiConnectorMixinAccess;
friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
-
+
ContainerType_ connectors_;
};
{
public:
typedef ConnectorType_ ConnectorType;
-
+
protected:
typedef ContainerType_ ContainerType;
# include BOOST_PP_ITERATE()
void disconnected(ConnectorType_ const & c);
-
+
friend class detail::MultiConnectorMixinAccess;
friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
ContainerType_ connectors_;
};
- template <class Self_,
+ template <class Self_,
class ConnectorType_>
class MultiConnectorMixin<Self_,ConnectorType_,void,void>
: private detail::MultiConnectorSelectBase<ConnectorType_>::type
};
#endif
-
+
}}}
///////////////////////////////hh.e////////////////////////////////////////