178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*=============================================================================
 | 
						|
    Copyright (c) 2005-2010 Joel de Guzman
 | 
						|
    Copyright (c) 2010 Eric Niebler
 | 
						|
    Copyright (c) 2010 Thomas Heller
 | 
						|
 | 
						|
    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)
 | 
						|
==============================================================================*/
 | 
						|
#ifndef BOOST_PHOENIX_CORE_IS_NULLARY_HPP
 | 
						|
#define BOOST_PHOENIX_CORE_IS_NULLARY_HPP
 | 
						|
 | 
						|
#include <boost/phoenix/core/limits.hpp>
 | 
						|
#include <boost/phoenix/core/environment.hpp>
 | 
						|
#include <boost/phoenix/core/is_actor.hpp>
 | 
						|
#include <boost/phoenix/core/meta_grammar.hpp>
 | 
						|
#include <boost/phoenix/core/terminal_fwd.hpp>
 | 
						|
#include <boost/phoenix/support/vector.hpp>
 | 
						|
#include <boost/proto/transform/fold.hpp>
 | 
						|
#include <boost/proto/transform/lazy.hpp>
 | 
						|
 | 
						|
namespace boost { namespace phoenix
 | 
						|
{
 | 
						|
    namespace result_of
 | 
						|
    {
 | 
						|
        template <typename Expr, typename Enable = void>
 | 
						|
        struct is_nullary;
 | 
						|
    }
 | 
						|
 | 
						|
    struct is_nullary
 | 
						|
    {
 | 
						|
        template <typename Rule, typename Dummy = void>
 | 
						|
        struct when
 | 
						|
            : proto::fold<
 | 
						|
                proto::_
 | 
						|
              , mpl::true_()
 | 
						|
              , mpl::and_<
 | 
						|
                    proto::_state
 | 
						|
                  , proto::call<evaluator(proto::_, _context)>
 | 
						|
                >()
 | 
						|
            >
 | 
						|
        {};
 | 
						|
    };
 | 
						|
    
 | 
						|
    template <typename Dummy>
 | 
						|
    struct is_nullary::when<rule::argument, Dummy>
 | 
						|
    {
 | 
						|
        BOOST_PROTO_TRANSFORM(is_nullary::when<rule::argument>)
 | 
						|
        template <typename Expr, typename State, typename Data>
 | 
						|
        struct impl
 | 
						|
        {
 | 
						|
            typedef mpl::false_ result_type;
 | 
						|
        };
 | 
						|
    };
 | 
						|
    
 | 
						|
    template <
 | 
						|
        typename Trait
 | 
						|
      , typename Expr
 | 
						|
      , typename State
 | 
						|
      , typename Data
 | 
						|
      , bool IsTransform = proto::is_transform<Trait>::value
 | 
						|
    >
 | 
						|
    struct is_nullary_custom_terminal_impl
 | 
						|
    {
 | 
						|
        typedef typename Trait::type result_type;
 | 
						|
    };
 | 
						|
    
 | 
						|
    template <typename Transform, typename Expr, typename State, typename Data>
 | 
						|
    struct is_nullary_custom_terminal_impl<Transform, Expr, State, Data, true>
 | 
						|
    {
 | 
						|
        typedef
 | 
						|
            typename Transform::template impl<
 | 
						|
                Expr
 | 
						|
              , State
 | 
						|
              , Data
 | 
						|
            >::result_type
 | 
						|
            result_type;
 | 
						|
    };
 | 
						|
 | 
						|
    template <typename Dummy>
 | 
						|
    struct is_nullary::when<rule::custom_terminal, Dummy>
 | 
						|
    {
 | 
						|
        BOOST_PROTO_TRANSFORM(is_nullary::when<rule::custom_terminal>)
 | 
						|
        
 | 
						|
        template <typename Expr, typename State, typename Data>
 | 
						|
        struct impl
 | 
						|
            : is_nullary_custom_terminal_impl<
 | 
						|
                result_of::is_nullary<
 | 
						|
                    custom_terminal<
 | 
						|
                        typename proto::detail::uncvref<
 | 
						|
                            typename proto::result_of::value<Expr>::type
 | 
						|
                        >::type
 | 
						|
                    >
 | 
						|
                >
 | 
						|
              , typename proto::result_of::value<Expr>::type
 | 
						|
              , State
 | 
						|
              , Data
 | 
						|
            >
 | 
						|
        {};
 | 
						|
    };
 | 
						|
    
 | 
						|
    template <typename Dummy>
 | 
						|
    struct is_nullary::when<rule::terminal, Dummy>
 | 
						|
    {
 | 
						|
        BOOST_PROTO_TRANSFORM(is_nullary::when<rule::terminal>)
 | 
						|
        template <typename Expr, typename State, typename Data>
 | 
						|
        struct impl
 | 
						|
        {
 | 
						|
            typedef mpl::true_ result_type;
 | 
						|
        };
 | 
						|
    };
 | 
						|
 | 
						|
    namespace result_of
 | 
						|
    {
 | 
						|
        template <typename Expr, typename Enable>
 | 
						|
        struct is_nullary
 | 
						|
            : boost::phoenix::evaluator::impl<
 | 
						|
                Expr const &
 | 
						|
              , vector2<
 | 
						|
                    mpl::true_
 | 
						|
                  , boost::phoenix::is_nullary
 | 
						|
                >
 | 
						|
              , proto::empty_env
 | 
						|
            >::result_type
 | 
						|
        {};
 | 
						|
        
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<T & >
 | 
						|
            : is_nullary<T>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<T const & >
 | 
						|
            : is_nullary<T>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<T const >
 | 
						|
            : is_nullary<T>
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<custom_terminal<T> >
 | 
						|
            : mpl::true_
 | 
						|
        {};
 | 
						|
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<custom_terminal<actor<T> > >
 | 
						|
            : evaluator
 | 
						|
        {};
 | 
						|
        
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<custom_terminal<boost::reference_wrapper<actor<T> > > >
 | 
						|
        {
 | 
						|
            BOOST_PROTO_TRANSFORM(is_nullary<custom_terminal<boost::reference_wrapper<actor<T> > > >)
 | 
						|
            template <typename Expr, typename State, typename Data>
 | 
						|
            struct impl
 | 
						|
            {
 | 
						|
                typedef typename evaluator::template impl<actor<T>, State, Data>::result_type result_type;
 | 
						|
            };
 | 
						|
        };
 | 
						|
        
 | 
						|
        template <typename T>
 | 
						|
        struct is_nullary<custom_terminal<boost::reference_wrapper<actor<T> const> > >
 | 
						|
        {
 | 
						|
            BOOST_PROTO_TRANSFORM(is_nullary<custom_terminal<boost::reference_wrapper<actor<T> const> > >)
 | 
						|
            template <typename Expr, typename State, typename Data>
 | 
						|
            struct impl
 | 
						|
            {
 | 
						|
                typedef typename evaluator::template impl<actor<T> const, State, Data>::result_type result_type;
 | 
						|
            };
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
}}
 | 
						|
 | 
						|
#endif
 | 
						|
 |