// $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>
//
-// 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
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// The contents of this file are subject to the Fraunhofer FOKUS Public License
+// Version 1.0 (the "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+// http://senf.berlios.de/license.html
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// The Fraunhofer FOKUS Public License Version 1.0 is based on,
+// but modifies the Mozilla Public License Version 1.1.
+// See the full license text for the amendments.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the
-// Free Software Foundation, Inc.,
-// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+// for the specific language governing rights and limitations under the License.
+//
+// The Original Code is Fraunhofer FOKUS code.
+//
+// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
+// (registered association), Hansastraße 27 c, 80686 Munich, Germany.
+// All Rights Reserved.
+//
+// Contributor(s):
+// Stefan Bund <g0dil@berlios.de>
/** \file
\brief MultiConnectorMixin public header */
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/mpl/if.hpp>
-#include "Connectors.hh"
-#include "Setup.hh"
#ifndef SENF_MULTI_CONNECTOR_MAX_ARGS
#define SENF_MULTI_CONNECTOR_MAX_ARGS 3
#include "MultiConnectorMixin.mpp"
#include "MultiConnectorMixin.ih"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
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 module {
- namespace detail { class MultiConnectorMixinAccess; }
+ namespace detail { struct 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:
void disconnected(ConnectorType_ const & c);
- friend class detail::MultiConnectorMixinAccess;
+ friend struct 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 struct 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
void disconnected(ConnectorType_ const & c);
- friend class detail::MultiConnectorMixinAccess;
+ friend struct detail::MultiConnectorMixinAccess;
friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
};
#endif
-
+
}}}
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
//#include "MultiConnectorMixin.cci"
#include "MultiConnectorMixin.ct"
#include "MultiConnectorMixin.cti"