/usr/include/boost/proto/transform
Edit: /usr/include/boost/proto/transform/impl.hpp (21669B)
///////////////////////////////////////////////////////////////////////////////
/// \file impl.hpp
/// Contains definition of transform<> and transform_impl<> helpers.
//
// 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_TRANSFORM_IMPL_HPP_EAN_04_03_2008
#define BOOST_PROTO_TRANSFORM_IMPL_HPP_EAN_04_03_2008
#include
#include
#include
#include
#include
#include
#include
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable : 4714) // function 'xxx' marked as __forceinline not inlined
#endif
namespace boost { namespace proto
{
namespace envns_
{
////////////////////////////////////////////////////////////////////////////////////////////
struct key_not_found
{};
////////////////////////////////////////////////////////////////////////////////////////////
// empty_env
struct empty_env
{
typedef void proto_environment_;
template
struct lookup
{
typedef OtherValue type;
typedef
typename add_reference::type>::type
const_reference;
};
key_not_found operator[](detail::any) const
{
return key_not_found();
}
template
T const &at(detail::any, T const &t) const
{
return t;
}
};
}
////////////////////////////////////////////////////////////////////////////////////////////
// is_env
template
struct is_env
: mpl::false_
{};
template
struct is_env
: mpl::true_
{};
template
struct is_env
: is_env
{};
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
/// INTERNAL ONLY
///
#define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \
BOOST_PROTO_CALLABLE() \
typedef X proto_is_transform_; \
typedef PrimitiveTransform transform_type; \
\
template \
struct result \
{ \
typedef typename boost::proto::detail::apply_transform::result_type type; \
}; \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &e) const \
{ \
boost::proto::empty_state s = 0; \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr const &e) const \
{ \
boost::proto::empty_state s = 0; \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &e, State &s) const \
{ \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr const &e, State &s) const \
{ \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &e, State const &s) const \
{ \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr const &e, State const &s) const \
{ \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &e, State &s, Data &d) const \
{ \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr const &e, State &s, Data &d) const \
{ \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &e, State const &s, Data &d) const \
{ \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr const &e, State const &s, Data &d) const \
{ \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
/**/
#else
/// INTERNAL ONLY
///
#define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \
BOOST_PROTO_CALLABLE() \
typedef X proto_is_transform_; \
typedef PrimitiveTransform transform_type; \
\
template \
struct result \
{ \
typedef typename boost::proto::detail::apply_transform::result_type type; \
}; \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &&e) const \
{ \
boost::proto::empty_state s = 0; \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &&e, State &&s) const \
{ \
boost::proto::empty_env d; \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
\
template \
BOOST_FORCEINLINE \
typename boost::proto::detail::apply_transform::result_type \
operator ()(Expr &&e, State &&s, Data &&d) const \
{ \
return boost::proto::detail::apply_transform()(e, s, d); \
} \
/**/
#endif
#define BOOST_PROTO_TRANSFORM(PrimitiveTransform) \
BOOST_PROTO_TRANSFORM_(PrimitiveTransform, void) \
/**/
namespace detail
{
template
struct apply_transform;
template
struct apply_transform
: PrimitiveTransform::template impl
{};
template
struct apply_transform
: PrimitiveTransform::template impl
{};
template
struct apply_transform
: PrimitiveTransform::template impl
{};
}
template
struct transform
{
BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X)
};
template
struct transform_impl
{
typedef Expr const expr;
typedef Expr const &expr_param;
typedef State const state;
typedef State const &state_param;
typedef Data const data;
typedef Data const &data_param;
};
template
struct transform_impl
{
typedef Expr expr;
typedef Expr &expr_param;
typedef State const state;
typedef State const &state_param;
typedef Data const data;
typedef Data const &data_param;
};
template
struct transform_impl
{
typedef Expr const expr;
typedef Expr const &expr_param;
typedef State state;
typedef State &state_param;
typedef Data const data;
typedef Data const &data_param;
};
template
struct transform_impl
{
typedef Expr const expr;
typedef Expr const &expr_param;
typedef State const state;
typedef State const &state_param;
typedef Data data;
typedef Data &data_param;
};
template
struct transform_impl
{
typedef Expr expr;
typedef Expr &expr_param;
typedef State state;
typedef State &state_param;
typedef Data const data;
typedef Data const &data_param;
};
template
struct transform_impl
{
typedef Expr expr;
typedef Expr &expr_param;
typedef State const state;
typedef State const &state_param;
typedef Data data;
typedef Data &data_param;
};
template
struct transform_impl
{
typedef Expr const expr;
typedef Expr const &expr_param;
typedef State state;
typedef State &state_param;
typedef Data data;
typedef Data &data_param;
};
template
struct transform_impl
{
typedef Expr expr;
typedef Expr &expr_param;
typedef State state;
typedef State &state_param;
typedef Data data;
typedef Data &data_param;
};
}} // namespace boost::proto
#if defined(_MSC_VER)
# pragma warning(pop)
#endif
#endif