You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
139 lines
4.4 KiB
139 lines
4.4 KiB
#ifndef BOOST_STATECHART_DETAIL_CONSTRUCTOR_HPP_INCLUDED |
|
#define BOOST_STATECHART_DETAIL_CONSTRUCTOR_HPP_INCLUDED |
|
////////////////////////////////////////////////////////////////////////////// |
|
// Copyright 2002-2006 Andreas Huber Doenni |
|
// Distributed under the Boost Software License, Version 1.0. (See accompany- |
|
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
#include <boost/mpl/eval_if.hpp> |
|
#include <boost/mpl/identity.hpp> |
|
#include <boost/mpl/equal_to.hpp> |
|
#include <boost/mpl/size.hpp> |
|
#include <boost/mpl/front.hpp> |
|
#include <boost/mpl/advance.hpp> |
|
#include <boost/mpl/find.hpp> |
|
#include <boost/mpl/push_front.hpp> |
|
#include <boost/mpl/pop_front.hpp> |
|
#include <boost/mpl/erase.hpp> |
|
#include <boost/mpl/reverse.hpp> |
|
#include <boost/mpl/long.hpp> |
|
|
|
|
|
|
|
namespace boost |
|
{ |
|
namespace statechart |
|
{ |
|
namespace detail |
|
{ |
|
|
|
|
|
|
|
template< class ContextList, class OutermostContextBase > |
|
struct constructor; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
template< class ContextList, class OutermostContextBase > |
|
struct outer_constructor |
|
{ |
|
typedef typename mpl::front< ContextList >::type to_construct; |
|
typedef typename to_construct::context_ptr_type context_ptr_type; |
|
typedef typename to_construct::inner_context_ptr_type |
|
inner_context_ptr_type; |
|
|
|
typedef typename to_construct::inner_initial_list inner_initial_list; |
|
typedef typename mpl::pop_front< ContextList >::type inner_context_list; |
|
typedef typename mpl::front< inner_context_list >::type::orthogonal_position |
|
inner_orthogonal_position; |
|
typedef typename mpl::advance< |
|
typename mpl::begin< inner_initial_list >::type, |
|
inner_orthogonal_position >::type to_construct_iter; |
|
|
|
typedef typename mpl::erase< |
|
inner_initial_list, |
|
to_construct_iter, |
|
typename mpl::end< inner_initial_list >::type |
|
>::type first_inner_initial_list; |
|
|
|
typedef typename mpl::erase< |
|
inner_initial_list, |
|
typename mpl::begin< inner_initial_list >::type, |
|
typename mpl::next< to_construct_iter >::type |
|
>::type last_inner_initial_list; |
|
|
|
static void construct( |
|
const context_ptr_type & pContext, |
|
OutermostContextBase & outermostContextBase ) |
|
{ |
|
const inner_context_ptr_type pInnerContext = |
|
to_construct::shallow_construct( pContext, outermostContextBase ); |
|
to_construct::template deep_construct_inner< |
|
first_inner_initial_list >( pInnerContext, outermostContextBase ); |
|
constructor< inner_context_list, OutermostContextBase >::construct( |
|
pInnerContext, outermostContextBase ); |
|
to_construct::template deep_construct_inner< |
|
last_inner_initial_list >( pInnerContext, outermostContextBase ); |
|
} |
|
}; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
template< class ContextList, class OutermostContextBase > |
|
struct inner_constructor |
|
{ |
|
typedef typename mpl::front< ContextList >::type to_construct; |
|
typedef typename to_construct::context_ptr_type context_ptr_type; |
|
|
|
static void construct( |
|
const context_ptr_type & pContext, |
|
OutermostContextBase & outermostContextBase ) |
|
{ |
|
to_construct::deep_construct( pContext, outermostContextBase ); |
|
} |
|
}; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
template< class ContextList, class OutermostContextBase > |
|
struct constructor_impl : public mpl::eval_if< |
|
mpl::equal_to< mpl::size< ContextList >, mpl::long_< 1 > >, |
|
mpl::identity< inner_constructor< ContextList, OutermostContextBase > >, |
|
mpl::identity< outer_constructor< ContextList, OutermostContextBase > > > |
|
{ |
|
}; |
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
template< class ContextList, class OutermostContextBase > |
|
struct constructor : |
|
constructor_impl< ContextList, OutermostContextBase >::type {}; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
template< class CommonContext, class DestinationState > |
|
struct make_context_list |
|
{ |
|
typedef typename mpl::reverse< typename mpl::push_front< |
|
typename mpl::erase< |
|
typename DestinationState::context_type_list, |
|
typename mpl::find< |
|
typename DestinationState::context_type_list, |
|
CommonContext |
|
>::type, |
|
typename mpl::end< |
|
typename DestinationState::context_type_list |
|
>::type |
|
>::type, |
|
DestinationState |
|
>::type >::type type; |
|
}; |
|
|
|
|
|
|
|
} // namespace detail |
|
} // namespace statechart |
|
} // namespace boost |
|
|
|
|
|
|
|
#endif
|
|
|