diff options
Diffstat (limited to '3rdParty/Boost/src/boost/phoenix/core/is_nullary.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/phoenix/core/is_nullary.hpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/phoenix/core/is_nullary.hpp b/3rdParty/Boost/src/boost/phoenix/core/is_nullary.hpp new file mode 100644 index 0000000..509c4d2 --- /dev/null +++ b/3rdParty/Boost/src/boost/phoenix/core/is_nullary.hpp @@ -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 + |