123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Copyright (c) 2001-2011 Hartmut Kaiser
- Copyright (c) 2009 Francois Barel
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ==============================================================================*/
- #if !defined(BOOST_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM)
- #define BOOST_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #include <boost/spirit/home/support/meta_compiler.hpp>
- #include <boost/spirit/home/support/nonterminal/locals.hpp>
- #include <boost/spirit/home/support/unused.hpp>
- #include <boost/spirit/home/support/common_terminals.hpp>
- #include <boost/function_types/is_function.hpp>
- #include <boost/function_types/parameter_types.hpp>
- #include <boost/function_types/result_type.hpp>
- #include <boost/fusion/include/as_list.hpp>
- #include <boost/fusion/include/as_vector.hpp>
- #include <boost/mpl/deref.hpp>
- #include <boost/mpl/end.hpp>
- #include <boost/mpl/eval_if.hpp>
- #include <boost/mpl/find_if.hpp>
- #include <boost/mpl/identity.hpp>
- #include <boost/mpl/if.hpp>
- #include <boost/mpl/or.hpp>
- #include <boost/mpl/and.hpp>
- #include <boost/mpl/placeholders.hpp>
- #include <boost/type_traits/is_same.hpp>
- namespace boost { namespace spirit { namespace detail
- {
- ///////////////////////////////////////////////////////////////////////////
- // Helpers to extract params (locals, attributes, ...) from nonterminal
- // template arguments
- ///////////////////////////////////////////////////////////////////////////
- template <typename Types, typename Pred, typename Default>
- struct extract_param
- {
- typedef typename mpl::find_if<Types, Pred>::type pos;
- typedef typename
- mpl::eval_if<
- is_same<pos, typename mpl::end<Types>::type>
- , mpl::identity<Default>
- , mpl::deref<pos>
- >::type
- type;
- };
- ///////////////////////////////////////////////////////////////////////////
- template <typename Types>
- struct extract_locals
- : fusion::result_of::as_vector<
- typename extract_param<
- Types
- , is_locals<mpl::_>
- , locals<>
- >::type
- >
- {};
- ///////////////////////////////////////////////////////////////////////////
- template <typename Domain, typename Types>
- struct extract_component
- : spirit::result_of::compile<
- Domain
- , typename extract_param<
- Types
- , traits::matches<Domain, mpl::_>
- , unused_type
- >::type
- >
- {};
- ///////////////////////////////////////////////////////////////////////////
- template <typename T>
- struct make_function_type : mpl::identity<T()> {};
- ///////////////////////////////////////////////////////////////////////////
- template <typename Types, typename Encoding, typename Domain>
- struct extract_sig
- {
- typedef typename
- extract_param<
- Types
- , mpl::or_<
- function_types::is_function<mpl::_>
- , mpl::and_<
- mpl::not_<is_locals<mpl::_> >
- , mpl::not_<is_same<mpl::_, Encoding> >
- , mpl::not_<traits::matches<Domain, mpl::_> >
- , mpl::not_<is_same<mpl::_, unused_type> >
- >
- >
- , void()
- >::type
- attr_of_ftype;
- typedef typename
- mpl::eval_if<
- function_types::is_function<attr_of_ftype>
- , mpl::identity<attr_of_ftype>
- , make_function_type<attr_of_ftype>
- >::type
- type;
- };
- template <typename Sig>
- struct attr_from_sig
- {
- typedef typename function_types::result_type<Sig>::type attr;
- typedef typename
- mpl::if_<
- is_same<attr, void>
- , unused_type
- , attr
- >::type
- type;
- };
- template <typename Sig>
- struct params_from_sig
- {
- typedef typename function_types::parameter_types<Sig>::type params;
- typedef typename fusion::result_of::as_list<params>::type type;
- };
- ///////////////////////////////////////////////////////////////////////////
- template <typename Types>
- struct extract_encoding
- : extract_param<
- Types
- , is_char_encoding<mpl::_>
- , unused_type
- >
- {};
- }}}
- #endif
|