00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_PPI_MultiConnectorMixin_
00027 #define HH_SENF_PPI_MultiConnectorMixin_ 1
00028
00029
00030 #include <senf/config.hh>
00031 #include <boost/ptr_container/ptr_map.hpp>
00032 #include <boost/ptr_container/ptr_vector.hpp>
00033 #include <boost/mpl/if.hpp>
00034
00035 #ifndef SENF_MULTI_CONNECTOR_MAX_ARGS
00036 #define SENF_MULTI_CONNECTOR_MAX_ARGS 3
00037 #endif
00038
00039 #include "MultiConnectorMixin.mpp"
00040 #include "MultiConnectorMixin.ih"
00041
00042
00043 namespace senf {
00044 namespace ppi {
00045
00046 #ifdef DOXYGEN
00047
00048
00049
00050
00051
00052
00053
00060 template <class MultiConnectorSource, class Target, class A1>
00061 MultiConnectorSource::ConnectorType & connect(
00062 MultiConnectorSource & source, A1 const & a1, Target & target);
00063
00070 template <class Source, class MultiConnectorTarget, class A1>
00071 MultiConnectorTarget::ConnectorType & connect(
00072 Source & source, MultiConnectorTarget & target, A1 const & a1);
00073
00074 template <class MultiConnectorSource, class MultiConnectorTarget, class A1, class A2>
00075 std::pair<MultiConnectorSource::ConnectorType &, MultiConnectorTarget::ConnectorType &>
00076 connect(
00077 MultiConnectorSource & source, MultiConnectorTarget & target, A1 const & a1, A2 const & a2);
00078
00079 #else
00080
00081
00082 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
00083 0, \
00084 SENF_MULTI_CONNECTOR_MAX_ARGS, \
00085 SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
00086 2 ))
00087 # include BOOST_PP_ITERATE()
00088
00089 #endif
00090
00091 namespace module {
00092
00093 namespace detail { class MultiConnectorMixinAccess; }
00094
00250 template <class Self_,
00251 class ConnectorType_,
00252 class KeyType_=void,
00253 class ContainerType_=typename detail::MultiConnectorDefaultContainer<
00254 KeyType_,ConnectorType_>::type>
00255 class MultiConnectorMixin
00256 : private detail::MultiConnectorSelectBase<ConnectorType_>::type
00257 {
00258 public:
00259 typedef ConnectorType_ ConnectorType;
00260
00261 protected:
00262 typedef ContainerType_ ContainerType;
00263
00264 ContainerType_ & connectors();
00265 ContainerType_ const & connectors() const;
00266
00267 void connectorDestroy(ConnectorType const &);
00268
00269 private:
00270
00271 #ifndef DOXYGEN
00272
00273
00274 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
00275 0, \
00276 SENF_MULTI_CONNECTOR_MAX_ARGS, \
00277 SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
00278 1 ))
00279 # include BOOST_PP_ITERATE()
00280
00281 #endif
00282
00283 void disconnected(ConnectorType_ const & c);
00284
00285 friend class detail::MultiConnectorMixinAccess;
00286 friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
00287
00288 ContainerType_ connectors_;
00289 };
00290
00291 #ifndef DOXYGEN
00292
00293 template <class Self_,
00294 class ConnectorType_,
00295 class ContainerType_>
00296 class MultiConnectorMixin<Self_,ConnectorType_,void,ContainerType_>
00297 : private detail::MultiConnectorSelectBase<ConnectorType_>::type
00298 {
00299 public:
00300 typedef ConnectorType_ ConnectorType;
00301
00302 protected:
00303 typedef ContainerType_ ContainerType;
00304
00305 ContainerType_ & connectors();
00306 ContainerType_ const & connectors() const;
00307
00308 void connectorDestroy(ConnectorType const &);
00309
00310 private:
00311
00312
00313 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
00314 0, \
00315 SENF_MULTI_CONNECTOR_MAX_ARGS, \
00316 SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
00317 1 ))
00318 # include BOOST_PP_ITERATE()
00319
00320 void disconnected(ConnectorType_ const & c);
00321
00322 friend class detail::MultiConnectorMixinAccess;
00323 friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
00324
00325 ContainerType_ connectors_;
00326 };
00327
00328 template <class Self_,
00329 class ConnectorType_>
00330 class MultiConnectorMixin<Self_,ConnectorType_,void,void>
00331 : private detail::MultiConnectorSelectBase<ConnectorType_>::type
00332 {
00333 public:
00334 typedef ConnectorType_ ConnectorType;
00335
00336 private:
00337
00338
00339 # define BOOST_PP_ITERATION_PARAMS_1 (4, ( \
00340 0, \
00341 SENF_MULTI_CONNECTOR_MAX_ARGS, \
00342 SENF_ABSOLUTE_INCLUDE_PATH(PPI/MultiConnectorMixin.mpp), \
00343 1 ))
00344 # include BOOST_PP_ITERATE()
00345
00346 void disconnected(ConnectorType_ const & c);
00347
00348 friend class detail::MultiConnectorMixinAccess;
00349 friend class detail::MultiConnectorWrapper<Self_,ConnectorType_>;
00350 };
00351
00352 #endif
00353
00354 }}}
00355
00356
00357
00358 #include "MultiConnectorMixin.ct"
00359 #include "MultiConnectorMixin.cti"
00360 #endif
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371