Initial Commit
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
/*=============================================================================
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user