#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 |