/usr/include/boost/proto/eval.hpp is in libboost1.62-dev 1.62.0+dfsg-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | ///////////////////////////////////////////////////////////////////////////////
/// \file eval.hpp
/// Contains the eval() expression evaluator.
//
// Copyright 2008 Eric Niebler. 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_PROTO_EVAL_HPP_EAN_03_29_2007
#define BOOST_PROTO_EVAL_HPP_EAN_03_29_2007
#include <boost/proto/proto_fwd.hpp> // BOOST_PROTO_CALLABLE
#include <boost/type_traits/remove_reference.hpp>
namespace boost { namespace proto
{
namespace result_of
{
/// \brief A metafunction for calculating the return type
/// of \c proto::eval() given a certain \c Expr and \c Context
/// types.
///
/// \note The types \c Expr and \c Context should not be
/// reference types. They may be cv-qualified, but the
/// cv-qualification on the \c Context parameter is ignored.
template<typename Expr, typename Context>
struct eval
{
typedef typename Context::template eval<Expr>::result_type type;
};
}
namespace functional
{
/// \brief A PolymorphicFunctionObject type for
/// evaluating a given Proto expression with a given
/// context.
struct eval
{
BOOST_PROTO_CALLABLE()
template<typename Sig>
struct result;
template<typename This, typename Expr, typename Context>
struct result<This(Expr, Context)>
{
typedef
typename proto::result_of::eval<
typename remove_reference<Expr>::type
, typename remove_reference<Context>::type
>::type
type;
};
/// \brief Evaluate a given Proto expression with a given
/// context.
/// \param expr The Proto expression to evaluate
/// \param context The context in which the expression should be
/// evaluated.
/// \return <tt>typename Context::template eval<Expr>()(expr, context)</tt>
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
operator ()(Expr &e, Context &ctx) const
{
return typename Context::template eval<Expr>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
operator ()(Expr &e, Context const &ctx) const
{
return typename Context::template eval<Expr>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr const, Context>::type
operator ()(Expr const &e, Context &ctx) const
{
return typename Context::template eval<Expr const>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr const, Context>::type
operator ()(Expr const &e, Context const &ctx) const
{
return typename Context::template eval<Expr const>()(e, ctx);
}
};
}
/// \brief Evaluate a given Proto expression with a given
/// context.
/// \param expr The Proto expression to evaluate
/// \param context The context in which the expression should be
/// evaluated.
/// \return <tt>typename Context::template eval<Expr>()(expr, context)</tt>
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
eval(Expr &e, Context &ctx)
{
return typename Context::template eval<Expr>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
eval(Expr &e, Context const &ctx)
{
return typename Context::template eval<Expr>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr const, Context>::type
eval(Expr const &e, Context &ctx)
{
return typename Context::template eval<Expr const>()(e, ctx);
}
/// \overload
///
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr const, Context>::type
eval(Expr const &e, Context const &ctx)
{
return typename Context::template eval<Expr const>()(e, ctx);
}
}}
#endif
|