1 /*=============================================================================
2     Copyright (c) 2001-2011 Hartmut Kaiser
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #if !defined(BOOST_SPIRIT_HAS_SEMANTIC_ACTION_SEP_20_2009_0626PM)
8 #define BOOST_SPIRIT_HAS_SEMANTIC_ACTION_SEP_20_2009_0626PM
9 
10 #if defined(_MSC_VER)
11 #pragma once
12 #endif
13 
14 #include <boost/mpl/bool.hpp>
15 #include <boost/mpl/or.hpp>
16 #include <boost/mpl/not.hpp>
17 #include <boost/mpl/find_if.hpp>
18 #include <boost/type_traits/is_same.hpp>
19 
20 namespace boost { namespace spirit { namespace traits
21 {
22     // finding out, whether a component contains a semantic action
23     template <typename T, typename Enable = void>
24     struct has_semantic_action
25       : mpl::false_ {};
26 
27     template <typename Subject>
28     struct unary_has_semantic_action
29       : has_semantic_action<Subject> {};
30 
31     template <typename Left, typename Right>
32     struct binary_has_semantic_action
33       : mpl::or_<has_semantic_action<Left>, has_semantic_action<Right> > {};
34 
35     template <typename Elements>
36     struct nary_has_semantic_action
37       : mpl::not_<
38             is_same<
39                 typename mpl::find_if<
40                     Elements, has_semantic_action<mpl::_>
41                 >::type
42               , typename mpl::end<Elements>::type
43             >
44         > {};
45 }}}
46 
47 #endif
48