7f0c7ab67ac657241144fedf794d2e90066d953a
[senf.git] / senf / PPI / Setup.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief Setup public header */
25
26 #ifndef HH_SENF_PPI_Setup_
27 #define HH_SENF_PPI_Setup_ 1
28
29 // Custom includes
30 #include <boost/type_traits.hpp>
31 #include <boost/utility/enable_if.hpp>
32 #include "predecl.hh"
33
34 //#include "Setup.mpp"
35 //-/////////////////////////////////////////////////////////////////////////////////////////////////
36
37 namespace senf {
38 namespace ppi {
39
40 namespace detail {
41     struct DisableStandardInput {};
42     struct DisableStandardOutput {};
43     struct DisableStandardConnect : public DisableStandardInput, public DisableStandardOutput {};
44 }
45
46 #ifdef DOXYGEN
47
48     /** \brief Connect modules
49
50         senf::ppi::connect() establishes a connection between two modules or, to be more precise,
51         between two connectors. It will connect any input to any output connector as long as one is
52         active and the other passive.
53
54         If a module has an output connector called \c output, the module may be directly specified
55         as \a source argument. In the same way, if a module has an input connector called \c input,
56         the module may be given directly as \a target argument. This simplifies the most common case
57         of a module with one input and one output connector.
58
59         The connect call will check at runtime, whether the two connectors are type-compatible:
60         \li Either or both of the connectors are untyped (they accept/send arbitrary senf::Packet's)
61         \li Both connectors send/accept the exactly same packet type.
62
63         Depending on the type of input or output, the connect call may require additional
64         arguments. See the respective module documentation for more information
65
66         \throws connector::IncompatibleConnectorsException if the two connectors are not type
67             compatible.
68
69         \see \ref ppi_connections
70      */
71     void connect(connector::OutputConnector & source, connector::InputConnector & target, ...);
72
73 #else
74
75     void connect(connector::GenericActiveOutput & source, connector::GenericPassiveInput & target);
76     void connect(connector::GenericPassiveOutput & source, connector::GenericActiveInput & target);
77
78 #endif
79
80 #ifndef DOXYGEN
81
82     template <class T, class C>
83     void connect(T & source, C & target,
84                  typename boost::disable_if< boost::is_base_of<connector::Connector, T> >::type * = 0,
85                  typename boost::enable_if< boost::is_base_of<connector::Connector, C> >::type * = 0,
86                  typename boost::disable_if< boost::is_base_of<detail::DisableStandardOutput, T> >::type * = 0);
87
88     template <class C, class T>
89     void connect(C & source, T & target,
90                  typename boost::enable_if< boost::is_base_of<connector::Connector, C> >::type * = 0,
91                  typename boost::disable_if< boost::is_base_of<connector::Connector,T> >::type * = 0,
92                  typename boost::disable_if< boost::is_base_of<detail::DisableStandardInput, T> >::type * = 0);
93
94     template <class T1, class T2>
95     void connect(T1 & source, T2 & target,
96                  typename boost::disable_if< boost::is_base_of<connector::Connector, T1> >::type * = 0,
97                  typename boost::disable_if< boost::is_base_of<connector::Connector, T2> >::type * = 0,
98                  typename boost::disable_if< boost::is_base_of<detail::DisableStandardOutput, T1> >:: type * = 0,
99                  typename boost::disable_if< boost::is_base_of<detail::DisableStandardInput, T2> >:: type * = 0);
100
101 #endif
102
103     /** \brief Start the network
104
105         Calling senf::ppi::run() will start processing the network. The main event loop is managed
106         by the Scheduler. Before starting the Scheduler main loop, all Module init() members are
107         called.
108
109         senf::ppi::run() will return when no more work is to be done, that is when no events are
110         enabled (Since the events are enabled and disabled by the throttle notifications which
111         depend among other things on the packet queues, this is the same as checking for packets in
112         any queue). It is Ok to call senf::ppi::run() multiple times during the program lifetime.
113
114         \see \ref ppi_run
115      */
116     void run();
117
118     /** \brief Manually initialize the network
119
120         For debugging purposes, it is sometimes simpler to not use senf::ppi::run() but instead
121         drive the network via explicit calls using the debug modules. However, it is still necessary
122         to initialize the network. This operation is performed by senf::ppi::init().
123      */
124     void init();
125
126 }}
127
128 //-/////////////////////////////////////////////////////////////////////////////////////////////////
129 #include "Setup.cci"
130 //#include "Setup.ct"
131 #include "Setup.cti"
132 #endif
133
134 \f
135 // Local Variables:
136 // mode: c++
137 // fill-column: 100
138 // comment-column: 40
139 // c-file-style: "senf"
140 // indent-tabs-mode: nil
141 // ispell-local-dictionary: "american"
142 // compile-command: "scons -u test"
143 // End: