MultiConnectorMixin.hh
Go to the documentation of this file.
1 //
2 // Copyright (c) 2020 Fraunhofer Institute for Applied Information Technology (FIT)
3 // Network Research Group (NET)
4 // Schloss Birlinghoven, 53754 Sankt Augustin, GERMANY
5 // Contact: support@wiback.org
6 //
7 // This file is part of the SENF code tree.
8 // It is licensed under the 3-clause BSD License (aka New BSD License).
9 // See LICENSE.txt in the top level directory for details or visit
10 // https://opensource.org/licenses/BSD-3-Clause
11 //
12 
13 
17 #ifndef HH_SENF_PPI_MultiConnectorMixin_
18 #define HH_SENF_PPI_MultiConnectorMixin_ 1
19 
20 // Custom includes
21 #include <senf/config.hh>
22 #include <boost/ptr_container/ptr_map.hpp>
23 #include <boost/ptr_container/ptr_vector.hpp>
24 #include <boost/mpl/if.hpp>
25 
26 #include "MultiConnectorMixin.mpp"
27 #include "MultiConnectorMixin.ih"
28 //-/////////////////////////////////////////////////////////////////////////////////////////////////
29 
30 namespace senf {
31 namespace ppi {
32 
33 #ifdef DOXYGEN
34 
35  // For exposition only.
36  // Other implementations with 0..SENF_MULTI_CONNECTOR_MAX_ARGS arguments accordingly
37  // The real implementation includes a boost::enable_if condition in the return value, which is
38  // used to only enable the correct overload: The first overload, if the MultiConnector is an
39  // output, otherwise the second overload.
40 
47  template <class MultiConnectorSource, class Target, class A1>
48  MultiConnectorSource::ConnectorType & connect(
49  MultiConnectorSource & source, A1 const & a1, Target & target);
50 
57  template <class Source, class MultiConnectorTarget, class A1>
58  MultiConnectorTarget::ConnectorType & connect(
59  Source & source, MultiConnectorTarget & target, A1 const & a1);
60 
61  template <class MultiConnectorSource, class MultiConnectorTarget, class A1, class A2>
62  std::pair<MultiConnectorSource::ConnectorType &, MultiConnectorTarget::ConnectorType &>
63  connect(
64  MultiConnectorSource & source, MultiConnectorTarget & target, A1 const & a1, A2 const & a2);
65 
66 #else
67 
68  // Include 'senf::ppi namespace member declarations' from MultiConnectorMixin.mpp
69 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
70  0, \
71  SENF_MULTI_CONNECTOR_MAX_ARGS, \
72  SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
73  2 ))
74 # include BOOST_PP_ITERATE()
75 
76 #endif
77 
78 namespace module {
79 
80  namespace detail { struct MultiConnectorMixinAccess; }
81 
237  template <class Self_,
238  class ConnectorType_,
239  class KeyType_ = void,
240  class ContainerType_ = typename detail::MultiConnectorDefaultContainer<KeyType_, ConnectorType_>::type>
242  : private detail::MultiConnectorSelectBase<ConnectorType_>::type
243  {
244  public:
245  typedef ConnectorType_ ConnectorType;
246 
247  protected:
248  typedef ContainerType_ ContainerType;
249 
250  ContainerType_ & connectors();
251  ContainerType_ const & connectors() const;
252 
253  void connectorDestroy(ConnectorType const &);
254 
255  private:
256 
257 #ifndef DOXYGEN
258 
259  // Include 'MultiConnectorMixin member declaration' from MultiConnectorMixin.mpp
260 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
261  0, \
262  SENF_MULTI_CONNECTOR_MAX_ARGS, \
263  SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
264  1 ))
265 # include BOOST_PP_ITERATE()
266 
267 #endif
268 
269  void disconnected(ConnectorType_ const & c);
270 
271  friend struct detail::MultiConnectorMixinAccess;
272  friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
273 
274  ContainerType_ connectors_;
275  };
276 
277 #ifndef DOXYGEN
278 
279  template <class Self_,
280  class ConnectorType_,
281  class ContainerType_>
282  class MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>
283  : private detail::MultiConnectorSelectBase<ConnectorType_>::type
284  {
285  public:
286  typedef ConnectorType_ ConnectorType;
287 
288  protected:
289  typedef ContainerType_ ContainerType;
290 
291  ContainerType_ & connectors();
292  ContainerType_ const & connectors() const;
293 
294  void connectorDestroy(ConnectorType const &);
295 
296  private:
297 
298  // Include 'MultiConnectorMixin member declaration' from MultiConnectorMixin.mpp
299 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
300  0, \
301  SENF_MULTI_CONNECTOR_MAX_ARGS, \
302  SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
303  1 ))
304 # include BOOST_PP_ITERATE()
305 
306  void disconnected(ConnectorType_ const & c);
307 
308  friend struct detail::MultiConnectorMixinAccess;
309  friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
310 
311  ContainerType_ connectors_;
312  };
313 
314  template <class Self_,
315  class ConnectorType_>
316  class MultiConnectorMixin<Self_,ConnectorType_,void,void>
317  : private detail::MultiConnectorSelectBase<ConnectorType_>::type
318  {
319  public:
320  typedef ConnectorType_ ConnectorType;
321 
322  private:
323 
324  // Include 'MultiConnectorMixin member declaration' from MultiConnectorMixin.mpp
325 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
326  0, \
327  SENF_MULTI_CONNECTOR_MAX_ARGS, \
328  SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
329  1 ))
330 # include BOOST_PP_ITERATE()
331 
332  void disconnected(ConnectorType_ const & c);
333 
334  friend struct detail::MultiConnectorMixinAccess;
335  friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
336  };
337 
338 #endif
339 
340 }}}
341 
342 //-/////////////////////////////////////////////////////////////////////////////////////////////////
343 //#include "MultiConnectorMixin.cci"
344 #include "MultiConnectorMixin.ct"
345 #include "MultiConnectorMixin.cti"
346 #endif
347 
348 
349 // Local Variables:
350 // mode: c++
351 // fill-column: 100
352 // comment-column: 40
353 // c-file-style: "senf"
354 // indent-tabs-mode: nil
355 // ispell-local-dictionary: "american"
356 // compile-command: "scons -u test"
357 // End:
ConnectorType_ ConnectorType
Type of MultiConnector connector.
ContainerType_ ContainerType
Type of connector container.
void connect(connector::FastActiveOutput< PacketType > &source, connector::FastPassiveInput< PacketType > &target)