1 #ifndef BOOST_STATECHART_PROCESSOR_CONTAINER_HPP_INCLUDED
2 #define BOOST_STATECHART_PROCESSOR_CONTAINER_HPP_INCLUDED
14 #include <boost/assert.hpp>
15 #include <boost/ref.hpp>
16 #include <boost/noncopyable.hpp>
17 #include <boost/intrusive_ptr.hpp>
18 #include <boost/shared_ptr.hpp>
19 #include <boost/weak_ptr.hpp>
20 #include <boost/bind.hpp>
21 #include <boost/config.hpp>
23 #include <boost/detail/workaround.hpp>
24 #include <boost/detail/allocator_utilities.hpp>
37 template<
bool IsReferenceWrapper>
40 template<
typename T >
47 template<
typename T >
48 struct apply {
typedef typename T::type &
type; };
55 is_reference_wrapper< T >::value >::template apply< T >::type
type;
63 class Allocator = std::allocator< none > >
67 #ifdef BOOST_NO_AUTO_PTR
68 typedef std::unique_ptr< processor_base_type > processor_holder_type;
70 typedef std::auto_ptr< processor_base_type > processor_holder_type;
72 typedef shared_ptr< processor_holder_type > processor_holder_ptr_type;
83 scheduler_( scheduler ),
88 #if BOOST_WORKAROUND( BOOST_INTEL, BOOST_TESTED_AT( 800 ) )
94 Scheduler & my_scheduler()
const {
return scheduler_; }
97 #if BOOST_WORKAROUND( BOOST_INTEL, BOOST_TESTED_AT( 800 ) )
104 Scheduler & scheduler_;
111 template<
class Processor >
114 processor_holder_ptr_type pProcessor = make_processor_holder();
117 const processor_holder_ptr_type &,
const processor_context & );
119 &processor_container::template create_processor_impl0< Processor >;
121 boost::bind( pImpl,
this, pProcessor,
122 processor_context( scheduler, handle ) ),
126 template<
class Processor,
typename Arg1 >
130 processor_holder_ptr_type pProcessor = make_processor_holder();
134 const processor_holder_ptr_type &,
const processor_context &,
137 &processor_container::template create_processor_impl1<
138 Processor, arg1_type >;
140 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
145 template<
class Processor,
typename Arg1,
typename Arg2 >
149 processor_holder_ptr_type pProcessor = make_processor_holder();
154 const processor_holder_ptr_type &,
const processor_context &,
155 arg1_type, arg2_type );
157 &processor_container::template create_processor_impl2<
158 Processor, arg1_type, arg2_type >;
160 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
165 template<
class Processor,
typename Arg1,
typename Arg2,
typename Arg3 >
168 Arg1 arg1, Arg2 arg2, Arg3 arg3 )
170 processor_holder_ptr_type pProcessor = make_processor_holder();
176 const processor_holder_ptr_type &,
const processor_context &,
177 arg1_type, arg2_type, arg3_type );
179 &processor_container::template create_processor_impl3<
180 Processor, arg1_type, arg2_type, arg3_type >;
182 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
188 class Processor,
typename Arg1,
typename Arg2,
189 typename Arg3,
typename Arg4 >
192 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4 )
194 processor_holder_ptr_type pProcessor = make_processor_holder();
201 const processor_holder_ptr_type &,
const processor_context &,
202 arg1_type, arg2_type, arg3_type, arg4_type );
204 &processor_container::template create_processor_impl4<
205 Processor, arg1_type, arg2_type, arg3_type, arg4_type >;
207 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
208 arg1, arg2, arg3, arg4 ),
213 class Processor,
typename Arg1,
typename Arg2,
214 typename Arg3,
typename Arg4,
typename Arg5 >
217 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5 )
219 processor_holder_ptr_type pProcessor = make_processor_holder();
227 const processor_holder_ptr_type &,
const processor_context &,
228 arg1_type, arg2_type, arg3_type, arg4_type, arg5_type );
230 &processor_container::template create_processor_impl5<
231 Processor, arg1_type, arg2_type, arg3_type, arg4_type, arg5_type >;
233 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
234 arg1, arg2, arg3, arg4, arg5 ),
239 class Processor,
typename Arg1,
typename Arg2,
240 typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6 >
243 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6 )
245 processor_holder_ptr_type pProcessor = make_processor_holder();
254 const processor_holder_ptr_type &,
const processor_context &,
255 arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type );
257 &processor_container::template create_processor_impl6<
259 arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type >;
261 boost::bind( pImpl,
this, pProcessor, processor_context( scheduler, handle ),
262 arg1, arg2, arg3, arg4, arg5, arg6 ),
269 boost::bind( &processor_container::destroy_processor_impl,
this, processor ),
276 boost::bind( &processor_container::initiate_processor_impl,
this,
284 boost::bind( &processor_container::terminate_processor_impl,
this,
294 BOOST_ASSERT( pEvent.get() != 0 );
297 boost::bind( &processor_container::queue_event_impl,
this, processor,
304 processor_holder_ptr_type make_processor_holder()
306 return processor_holder_ptr_type(
new processor_holder_type() );
309 template<
class Processor >
310 void create_processor_impl0(
311 const processor_holder_ptr_type & pProcessor,
312 const processor_context & context )
314 processorSet_.insert( pProcessor );
315 *pProcessor = processor_holder_type(
new Processor( context ) );
318 template<
class Processor,
typename Arg1 >
319 void create_processor_impl1(
320 const processor_holder_ptr_type & pProcessor,
321 const processor_context & context, Arg1 arg1 )
323 processorSet_.insert( pProcessor );
324 *pProcessor = processor_holder_type(
new Processor( context, arg1 ) );
327 template<
class Processor,
typename Arg1,
typename Arg2 >
328 void create_processor_impl2(
329 const processor_holder_ptr_type & pProcessor,
330 const processor_context & context, Arg1 arg1, Arg2 arg2 )
332 processorSet_.insert( pProcessor );
333 *pProcessor = processor_holder_type(
new Processor( context, arg1, arg2 ) );
336 template<
class Processor,
typename Arg1,
typename Arg2,
typename Arg3 >
337 void create_processor_impl3(
338 const processor_holder_ptr_type & pProcessor,
339 const processor_context & context, Arg1 arg1, Arg2 arg2, Arg3 arg3 )
341 processorSet_.insert( pProcessor );
342 *pProcessor = processor_holder_type(
new Processor( context, arg1, arg2, arg3 ) );
346 class Processor,
typename Arg1,
typename Arg2,
347 typename Arg3,
typename Arg4 >
348 void create_processor_impl4(
349 const processor_holder_ptr_type & pProcessor,
350 const processor_context & context,
351 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4 )
353 processorSet_.insert( pProcessor );
354 *pProcessor = processor_holder_type(
new Processor( context, arg1, arg2, arg3, arg4 ) );
358 class Processor,
typename Arg1,
typename Arg2,
359 typename Arg3,
typename Arg4,
typename Arg5 >
360 void create_processor_impl5(
361 const processor_holder_ptr_type & pProcessor,
362 const processor_context & context,
363 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5 )
365 processorSet_.insert( pProcessor );
366 *pProcessor = processor_holder_type(
new Processor( context, arg1, arg2, arg3, arg4, arg5 ) );
370 class Processor,
typename Arg1,
typename Arg2,
371 typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6 >
372 void create_processor_impl6(
373 const processor_holder_ptr_type & pProcessor,
374 const processor_context & context,
375 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6 )
377 processorSet_.insert( pProcessor );
378 *pProcessor = processor_holder_type(
new Processor( context, arg1, arg2, arg3, arg4, arg5, arg6 ) );
383 const processor_holder_ptr_type pProcessor = processor.lock();
385 if ( pProcessor != 0 )
387 processorSet_.erase( pProcessor );
393 const processor_holder_ptr_type pProcessor = processor.lock();
395 if ( pProcessor != 0 )
397 ( *pProcessor )->initiate();
403 const processor_holder_ptr_type pProcessor = processor.lock();
405 if ( pProcessor != 0 )
407 ( *pProcessor )->terminate();
411 void queue_event_impl(
414 const processor_holder_ptr_type pProcessor = processor.lock();
416 if ( pProcessor != 0 )
418 ( *pProcessor )->process_event( *pEvent );
423 processor_holder_ptr_type,
424 std::less< processor_holder_ptr_type >,
425 typename boost::detail::allocator::rebind_to<
426 Allocator, processor_holder_ptr_type >::type
427 > event_processor_set_type;
429 event_processor_set_type processorSet_;