Chris@16: #ifndef BOOST_STATECHART_DETAIL_CONSTRUCTOR_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_DETAIL_CONSTRUCTOR_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2002-2006 Andreas Huber Doenni Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: template< class ContextList, class OutermostContextBase > Chris@16: struct constructor; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class ContextList, class OutermostContextBase > Chris@16: struct outer_constructor Chris@16: { Chris@16: typedef typename mpl::front< ContextList >::type to_construct; Chris@16: typedef typename to_construct::context_ptr_type context_ptr_type; Chris@16: typedef typename to_construct::inner_context_ptr_type Chris@16: inner_context_ptr_type; Chris@16: Chris@16: typedef typename to_construct::inner_initial_list inner_initial_list; Chris@16: typedef typename mpl::pop_front< ContextList >::type inner_context_list; Chris@16: typedef typename mpl::front< inner_context_list >::type::orthogonal_position Chris@16: inner_orthogonal_position; Chris@16: typedef typename mpl::advance< Chris@16: typename mpl::begin< inner_initial_list >::type, Chris@16: inner_orthogonal_position >::type to_construct_iter; Chris@16: Chris@16: typedef typename mpl::erase< Chris@16: inner_initial_list, Chris@16: to_construct_iter, Chris@16: typename mpl::end< inner_initial_list >::type Chris@16: >::type first_inner_initial_list; Chris@16: Chris@16: typedef typename mpl::erase< Chris@16: inner_initial_list, Chris@16: typename mpl::begin< inner_initial_list >::type, Chris@16: typename mpl::next< to_construct_iter >::type Chris@16: >::type last_inner_initial_list; Chris@16: Chris@16: static void construct( Chris@16: const context_ptr_type & pContext, Chris@16: OutermostContextBase & outermostContextBase ) Chris@16: { Chris@16: const inner_context_ptr_type pInnerContext = Chris@16: to_construct::shallow_construct( pContext, outermostContextBase ); Chris@16: to_construct::template deep_construct_inner< Chris@16: first_inner_initial_list >( pInnerContext, outermostContextBase ); Chris@16: constructor< inner_context_list, OutermostContextBase >::construct( Chris@16: pInnerContext, outermostContextBase ); Chris@16: to_construct::template deep_construct_inner< Chris@16: last_inner_initial_list >( pInnerContext, outermostContextBase ); Chris@16: } Chris@16: }; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class ContextList, class OutermostContextBase > Chris@16: struct inner_constructor Chris@16: { Chris@16: typedef typename mpl::front< ContextList >::type to_construct; Chris@16: typedef typename to_construct::context_ptr_type context_ptr_type; Chris@16: Chris@16: static void construct( Chris@16: const context_ptr_type & pContext, Chris@16: OutermostContextBase & outermostContextBase ) Chris@16: { Chris@16: to_construct::deep_construct( pContext, outermostContextBase ); Chris@16: } Chris@16: }; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class ContextList, class OutermostContextBase > Chris@16: struct constructor_impl : public mpl::eval_if< Chris@16: mpl::equal_to< mpl::size< ContextList >, mpl::long_< 1 > >, Chris@16: mpl::identity< inner_constructor< ContextList, OutermostContextBase > >, Chris@16: mpl::identity< outer_constructor< ContextList, OutermostContextBase > > > Chris@16: { Chris@16: }; Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class ContextList, class OutermostContextBase > Chris@16: struct constructor : Chris@16: constructor_impl< ContextList, OutermostContextBase >::type {}; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class CommonContext, class DestinationState > Chris@16: struct make_context_list Chris@16: { Chris@16: typedef typename mpl::reverse< typename mpl::push_front< Chris@16: typename mpl::erase< Chris@16: typename DestinationState::context_type_list, Chris@16: typename mpl::find< Chris@16: typename DestinationState::context_type_list, Chris@16: CommonContext Chris@16: >::type, Chris@16: typename mpl::end< Chris@16: typename DestinationState::context_type_list Chris@16: >::type Chris@16: >::type, Chris@16: DestinationState Chris@16: >::type >::type type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif