diff DEPENDENCIES/generic/include/boost/proto/proto_fwd.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/proto/proto_fwd.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,886 @@
+///////////////////////////////////////////////////////////////////////////////
+/// \file proto_fwd.hpp
+/// Forward declarations of all of proto's public types and functions.
+//
+//  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_FWD_HPP_EAN_04_01_2005
+#define BOOST_PROTO_FWD_HPP_EAN_04_01_2005
+
+#include <cstddef>
+#include <climits>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/punctuation/comma.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/ref.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/mpl/aux_/config/ttp.hpp>
+#include <boost/utility/result_of.hpp>
+
+#ifndef BOOST_PROTO_MAX_ARITY
+# define BOOST_PROTO_MAX_ARITY 10
+#endif
+
+#ifndef BOOST_PROTO_MAX_LOGICAL_ARITY
+# define BOOST_PROTO_MAX_LOGICAL_ARITY 10
+#endif
+
+#ifndef BOOST_PROTO_MAX_FUNCTION_CALL_ARITY
+# define BOOST_PROTO_MAX_FUNCTION_CALL_ARITY BOOST_PROTO_MAX_ARITY
+#endif
+
+#if BOOST_PROTO_MAX_ARITY < 3
+# error BOOST_PROTO_MAX_ARITY must be at least 3
+#endif
+
+#if BOOST_PROTO_MAX_FUNCTION_CALL_ARITY > BOOST_PROTO_MAX_ARITY
+# error BOOST_PROTO_MAX_FUNCTION_CALL_ARITY cannot be larger than BOOST_PROTO_MAX_ARITY
+#endif
+
+#ifndef BOOST_PROTO_DONT_USE_PREPROCESSED_FILES
+  #if 10 < BOOST_PROTO_MAX_ARITY ||                                                                 \
+      10 < BOOST_PROTO_MAX_LOGICAL_ARITY ||                                                         \
+      10 < BOOST_PROTO_MAX_FUNCTION_CALL_ARITY
+    #define BOOST_PROTO_DONT_USE_PREPROCESSED_FILES
+  #endif
+#endif
+
+#ifndef BOOST_PROTO_BROKEN_CONST_OVERLOADS
+# if BOOST_WORKAROUND(__GNUC__, == 3) \
+  || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310))
+#  define BOOST_PROTO_BROKEN_CONST_OVERLOADS
+# endif
+#endif
+
+#ifndef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
+# if BOOST_WORKAROUND(__GNUC__, == 3) \
+  || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310))
+#  define BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
+# endif
+#endif
+
+#ifdef BOOST_PROTO_BROKEN_CONST_OVERLOADS
+# include <boost/utility/enable_if.hpp>
+# include <boost/type_traits/is_const.hpp>
+# define BOOST_PROTO_DISABLE_IF_IS_CONST(T)\
+    , typename boost::disable_if_c<boost::is_const<T>::value, boost::proto::detail::undefined>::type * = 0
+#else
+# define BOOST_PROTO_DISABLE_IF_IS_CONST(T)
+#endif
+
+#ifdef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
+# include <boost/utility/enable_if.hpp>
+# include <boost/type_traits/is_function.hpp>
+# define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T)\
+    , typename boost::disable_if_c<boost::is_function<T>::value, boost::proto::detail::undefined>::type * = 0
+#else
+# define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T)
+#endif
+
+#ifndef BOOST_PROTO_BROKEN_PTS
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#  define BOOST_PROTO_BROKEN_PTS
+# endif
+#endif
+
+#ifdef BOOST_NO_CXX11_DECLTYPE_N3276
+# // Proto can only use the decltype-based result_of if N3276 has been
+# // implemented by the compiler.
+# // See http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf
+# ifndef BOOST_PROTO_USE_NORMAL_RESULT_OF
+#  define BOOST_PROTO_USE_NORMAL_RESULT_OF
+# endif
+#endif
+
+// Unless compiler support is there, use tr1_result_of instead of
+// result_of to avoid the problems addressed by N3276.
+#ifdef BOOST_PROTO_USE_NORMAL_RESULT_OF
+# define BOOST_PROTO_RESULT_OF boost::result_of
+#else
+# define BOOST_PROTO_RESULT_OF boost::tr1_result_of
+#endif
+
+// If we're using the decltype-based result_of, we need to be a bit
+// stricter about the return types of some functions.
+#if defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_PROTO_USE_NORMAL_RESULT_OF)
+# define BOOST_PROTO_STRICT_RESULT_OF
+# define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) X
+#else
+# define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) Y
+#endif
+
+#ifdef BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING
+# define BOOST_PROTO_EXTENDED_TEMPLATE_PARAMETERS_MATCHING 
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# define BOOST_PROTO_DISABLE_MSVC_C4522 __pragma(warning(disable : 4522))  // 'class' : multiple assignment operators specified
+# define BOOST_PROTO_DISABLE_MSVC_C4714 __pragma(warning(disable : 4714))  // function 'xxx' marked as __forceinline not inlined
+#else
+# define BOOST_PROTO_DISABLE_MSVC_C4522 
+# define BOOST_PROTO_DISABLE_MSVC_C4714
+#endif
+
+namespace boost { namespace proto
+{
+    namespace detail
+    {
+        typedef char yes_type;
+        typedef char (&no_type)[2];
+
+        template<int N>
+        struct sized_type
+        {
+            typedef char (&type)[N];
+        };
+
+        struct dont_care;
+        struct undefined; // leave this undefined
+        struct not_a_valid_type;
+
+        struct private_type_
+        {
+            private_type_ operator ,(int) const;
+        };
+
+        template<typename T>
+        struct uncvref
+        {
+            typedef T type;
+        };
+
+        template<typename T>
+        struct uncvref<T const>
+        {
+            typedef T type;
+        };
+
+        template<typename T>
+        struct uncvref<T &>
+        {
+            typedef T type;
+        };
+
+        template<typename T>
+        struct uncvref<T const &>
+        {
+            typedef T type;
+        };
+
+        template<typename T, std::size_t N>
+        struct uncvref<T const[N]>
+        {
+            typedef T type[N];
+        };
+
+        template<typename T, std::size_t N>
+        struct uncvref<T (&)[N]>
+        {
+            typedef T type[N];
+        };
+
+        template<typename T, std::size_t N>
+        struct uncvref<T const (&)[N]>
+        {
+            typedef T type[N];
+        };
+
+        struct ignore
+        {
+            ignore()
+            {}
+
+            template<typename T>
+            ignore(T const &)
+            {}
+        };
+
+        /// INTERNAL ONLY
+        ///
+        #define BOOST_PROTO_UNCVREF(X)                                                              \
+            typename boost::proto::detail::uncvref<X>::type                                         \
+            /**/
+
+        struct _default;
+
+        struct not_a_domain;
+        struct not_a_grammar;
+        struct not_a_generator;
+
+        template<typename T, typename Void = void>
+        struct is_transform_;
+
+        template<typename T, typename Void = void>
+        struct is_aggregate_;
+
+        template<typename Expr>
+        struct flat_view;
+    }
+
+    typedef detail::ignore const ignore;
+
+    namespace argsns_
+    {
+        template<typename Arg0>
+        struct term;
+
+        #define M0(Z, N, DATA)                                                                      \
+        template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename Arg)> struct BOOST_PP_CAT(list, N);          \
+        /**/
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), M0, ~)
+        #undef M0
+    }
+
+    using namespace argsns_;
+
+    ///////////////////////////////////////////////////////////////////////////////
+    // Operator tags
+    namespace tagns_
+    {
+        namespace tag
+        {
+            struct terminal;
+            struct unary_plus;
+            struct negate;
+            struct dereference;
+            struct complement;
+            struct address_of;
+            struct logical_not;
+            struct pre_inc;
+            struct pre_dec;
+            struct post_inc;
+            struct post_dec;
+
+            struct shift_left;
+            struct shift_right;
+            struct multiplies;
+            struct divides;
+            struct modulus;
+            struct plus;
+            struct minus;
+            struct less;
+            struct greater;
+            struct less_equal;
+            struct greater_equal;
+            struct equal_to;
+            struct not_equal_to;
+            struct logical_or;
+            struct logical_and;
+            struct bitwise_and;
+            struct bitwise_or;
+            struct bitwise_xor;
+            struct comma;
+            struct mem_ptr;
+
+            struct assign;
+            struct shift_left_assign;
+            struct shift_right_assign;
+            struct multiplies_assign;
+            struct divides_assign;
+            struct modulus_assign;
+            struct plus_assign;
+            struct minus_assign;
+            struct bitwise_and_assign;
+            struct bitwise_or_assign;
+            struct bitwise_xor_assign;
+            struct subscript;
+            struct member;
+            struct if_else_;
+            struct function;
+
+            // Fusion tags
+            template<typename Tag, typename Domain> struct proto_expr;
+            template<typename Tag, typename Domain> struct proto_expr_iterator;
+            template<typename Tag, typename Domain> struct proto_flat_view;
+        }
+    }
+
+    using namespace tagns_;
+
+    template<typename Expr>
+    struct tag_of;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    struct _;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    struct default_generator;
+
+    struct basic_default_generator;
+
+    template<template<typename> class Extends>
+    struct generator;
+
+    template<template<typename> class Extends>
+    struct pod_generator;
+
+    struct by_value_generator;
+
+    template<typename First, typename Second>
+    struct compose_generators;
+
+    template<typename Generator, typename Void = void>
+    struct wants_basic_expr;
+
+    template<typename Generator>
+    struct use_basic_expr;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    namespace domainns_
+    {
+        typedef detail::not_a_domain no_super_domain;
+
+        template<
+            typename Generator  = default_generator
+          , typename Grammar    = proto::_
+          , typename Super      = no_super_domain
+        >
+        struct domain;
+
+        struct default_domain;
+
+        struct basic_default_domain;
+
+        struct deduce_domain;
+
+        template<typename Domain, typename Tag, typename Args, bool WantsBasicExpr = wants_basic_expr<typename Domain::proto_generator>::value>
+        struct base_expr;
+    }
+
+    using namespace domainns_;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+    namespace exprns_
+    {
+        template<typename Tag, typename Args, long Arity = Args::arity>
+        struct basic_expr;
+
+        template<typename Tag, typename Args, long Arity = Args::arity>
+        struct expr;
+
+        template<
+            typename Expr
+          , typename Derived
+          , typename Domain = default_domain
+          , long Arity = Expr::proto_arity_c
+        >
+        struct extends;
+
+        template<typename This, typename Fun, typename Domain>
+        struct virtual_member;
+        
+        struct is_proto_expr;
+    }
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    using exprns_::expr;
+    using exprns_::basic_expr;
+    using exprns_::extends;
+    using exprns_::is_proto_expr;
+
+    template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
+    struct or_;
+
+    template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
+    struct and_;
+
+    template<typename Grammar>
+    struct not_;
+
+    template<typename Condition, typename Then = _, typename Else = not_<_> >
+    struct if_;
+
+    template<typename Cases, typename Transform = tag_of<_>()>
+    struct switch_;
+
+    template<typename T>
+    struct exact;
+
+    template<typename T>
+    struct convertible_to;
+
+    template<typename Grammar>
+    struct vararg;
+
+    struct pack;
+
+    // Boost bug https://svn.boost.org/trac/boost/ticket/4602
+    //int const N = INT_MAX;
+    int const N = (INT_MAX >> 10);
+
+    namespace context
+    {
+        struct null_context;
+
+        template<typename Expr, typename Context, long Arity = Expr::proto_arity_c>
+        struct null_eval;
+
+        struct default_context;
+
+        template<typename Expr, typename Context, typename Tag = typename Expr::proto_tag, long Arity = Expr::proto_arity_c>
+        struct default_eval;
+
+        template<typename Derived, typename DefaultCtx = default_context>
+        struct callable_context;
+
+        template<typename Expr, typename Context, long Arity = Expr::proto_arity_c>
+        struct callable_eval;
+    }
+
+    using context::null_context;
+    using context::null_eval;
+    using context::default_context;
+    using context::default_eval;
+    using context::callable_context;
+    using context::callable_eval;
+
+    namespace utility
+    {
+        template<typename T, typename Domain = default_domain>
+        struct literal;
+    }
+
+    using utility::literal;
+
+    namespace result_of
+    {
+        template<typename T, typename Domain = default_domain>
+        struct as_expr;
+
+        template<typename T, typename Domain = default_domain>
+        struct as_child;
+
+        template<typename Expr, typename N = mpl::long_<0> >
+        struct child;
+
+        template<typename Expr, long N>
+        struct child_c;
+
+        template<typename Expr>
+        struct left;
+
+        template<typename Expr>
+        struct right;
+
+        template<typename Expr>
+        struct deep_copy;
+
+        template<typename Expr, typename Context>
+        struct eval;
+
+        template<
+            typename Tag
+          , typename DomainOrA0
+            BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(
+                BOOST_PROTO_MAX_ARITY
+              , typename A
+              , = void BOOST_PP_INTERCEPT
+            )
+          , typename Void = void
+        >
+        struct make_expr;
+
+        template<typename Tag, typename DomainOrSequence, typename SequenceOrVoid = void, typename Void = void>
+        struct unpack_expr;
+
+        template<typename T>
+        struct as_env;
+
+        template<typename Env, typename Tag>
+        struct has_env_var;
+
+        template<typename Env, typename Tag>
+        struct env_var;
+    }
+
+    template<typename T, typename Void = void>
+    struct is_expr;
+
+    template<typename T, typename Void = void>
+    struct is_domain;
+
+    template<typename SubDomain, typename SuperDomain>
+    struct is_sub_domain_of;
+
+    template<typename T, typename Void = void>
+    struct is_env;
+
+    template<typename Expr>
+    struct arity_of;
+
+    template<typename T, typename Void = void>
+    struct domain_of;
+
+    template<typename Expr, typename Grammar>
+    struct matches;
+
+    // Generic expression metafunctions and
+    // grammar elements
+    template<typename Tag, typename Arg>
+    struct unary_expr;
+
+    template<typename Tag, typename Left, typename Right>
+    struct binary_expr;
+
+    template<typename Tag, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)>
+    struct nary_expr;
+
+    // Specific expression metafunctions and
+    // grammar elements, for convenience
+    template<typename T> struct terminal;
+    template<typename T> struct unary_plus;
+    template<typename T> struct negate;
+    template<typename T> struct dereference;
+    template<typename T> struct complement;
+    template<typename T> struct address_of;
+    template<typename T> struct logical_not;
+    template<typename T> struct pre_inc;
+    template<typename T> struct pre_dec;
+    template<typename T> struct post_inc;
+    template<typename T> struct post_dec;
+
+    template<typename T, typename U> struct shift_left;
+    template<typename T, typename U> struct shift_right;
+    template<typename T, typename U> struct multiplies;
+    template<typename T, typename U> struct divides;
+    template<typename T, typename U> struct modulus;
+    template<typename T, typename U> struct plus;
+    template<typename T, typename U> struct minus;
+    template<typename T, typename U> struct less;
+    template<typename T, typename U> struct greater;
+    template<typename T, typename U> struct less_equal;
+    template<typename T, typename U> struct greater_equal;
+    template<typename T, typename U> struct equal_to;
+    template<typename T, typename U> struct not_equal_to;
+    template<typename T, typename U> struct logical_or;
+    template<typename T, typename U> struct logical_and;
+    template<typename T, typename U> struct bitwise_and;
+    template<typename T, typename U> struct bitwise_or;
+    template<typename T, typename U> struct bitwise_xor;
+    template<typename T, typename U> struct comma;
+    template<typename T, typename U> struct mem_ptr;
+
+    template<typename T, typename U> struct assign;
+    template<typename T, typename U> struct shift_left_assign;
+    template<typename T, typename U> struct shift_right_assign;
+    template<typename T, typename U> struct multiplies_assign;
+    template<typename T, typename U> struct divides_assign;
+    template<typename T, typename U> struct modulus_assign;
+    template<typename T, typename U> struct plus_assign;
+    template<typename T, typename U> struct minus_assign;
+    template<typename T, typename U> struct bitwise_and_assign;
+    template<typename T, typename U> struct bitwise_or_assign;
+    template<typename T, typename U> struct bitwise_xor_assign;
+    template<typename T, typename U> struct subscript;
+    template<typename T, typename U> struct member;
+    template<typename T, typename U, typename V> struct if_else_;
+
+    template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)>
+    struct function;
+
+    namespace functional
+    {
+        struct left;
+        struct right;
+        struct eval;
+        struct deep_copy;
+
+        template<typename Domain = default_domain>
+        struct as_expr;
+
+        template<typename Domain = default_domain>
+        struct as_child;
+
+        template<typename N = mpl::long_<0> >
+        struct child;
+
+        template<long N>
+        struct child_c;
+
+        struct as_env;
+
+        template<typename Tag>
+        struct has_env_var;
+
+        template<typename Tag>
+        struct env_var;
+
+        template<typename Tag, typename Domain = deduce_domain>
+        struct make_expr;
+
+        template<typename Tag, typename Domain = deduce_domain>
+        struct unpack_expr;
+
+        typedef make_expr<tag::terminal>            make_terminal;
+        typedef make_expr<tag::unary_plus>          make_unary_plus;
+        typedef make_expr<tag::negate>              make_negate;
+        typedef make_expr<tag::dereference>         make_dereference;
+        typedef make_expr<tag::complement>          make_complement;
+        typedef make_expr<tag::address_of>          make_address_of;
+        typedef make_expr<tag::logical_not>         make_logical_not;
+        typedef make_expr<tag::pre_inc>             make_pre_inc;
+        typedef make_expr<tag::pre_dec>             make_pre_dec;
+        typedef make_expr<tag::post_inc>            make_post_inc;
+        typedef make_expr<tag::post_dec>            make_post_dec;
+        typedef make_expr<tag::shift_left>          make_shift_left;
+        typedef make_expr<tag::shift_right>         make_shift_right;
+        typedef make_expr<tag::multiplies>          make_multiplies;
+        typedef make_expr<tag::divides>             make_divides;
+        typedef make_expr<tag::modulus>             make_modulus;
+        typedef make_expr<tag::plus>                make_plus;
+        typedef make_expr<tag::minus>               make_minus;
+        typedef make_expr<tag::less>                make_less;
+        typedef make_expr<tag::greater>             make_greater;
+        typedef make_expr<tag::less_equal>          make_less_equal;
+        typedef make_expr<tag::greater_equal>       make_greater_equal;
+        typedef make_expr<tag::equal_to>            make_equal_to;
+        typedef make_expr<tag::not_equal_to>        make_not_equal_to;
+        typedef make_expr<tag::logical_or>          make_logical_or;
+        typedef make_expr<tag::logical_and>         make_logical_and;
+        typedef make_expr<tag::bitwise_and>         make_bitwise_and;
+        typedef make_expr<tag::bitwise_or>          make_bitwise_or;
+        typedef make_expr<tag::bitwise_xor>         make_bitwise_xor;
+        typedef make_expr<tag::comma>               make_comma;
+        typedef make_expr<tag::mem_ptr>             make_mem_ptr;
+        typedef make_expr<tag::assign>              make_assign;
+        typedef make_expr<tag::shift_left_assign>   make_shift_left_assign;
+        typedef make_expr<tag::shift_right_assign>  make_shift_right_assign;
+        typedef make_expr<tag::multiplies_assign>   make_multiplies_assign;
+        typedef make_expr<tag::divides_assign>      make_divides_assign;
+        typedef make_expr<tag::modulus_assign>      make_modulus_assign;
+        typedef make_expr<tag::plus_assign>         make_plus_assign;
+        typedef make_expr<tag::minus_assign>        make_minus_assign;
+        typedef make_expr<tag::bitwise_and_assign>  make_bitwise_and_assign;
+        typedef make_expr<tag::bitwise_or_assign>   make_bitwise_or_assign;
+        typedef make_expr<tag::bitwise_xor_assign>  make_bitwise_xor_assign;
+        typedef make_expr<tag::subscript>           make_subscript;
+        typedef make_expr<tag::if_else_>            make_if_else;
+        typedef make_expr<tag::function>            make_function;
+
+        struct flatten;
+        struct make_pair;
+        struct first;
+        struct second;
+        struct at;
+        struct pop_front;
+        struct push_front;
+        struct pop_back;
+        struct push_back;
+        struct reverse;
+    }
+
+    typedef functional::flatten     _flatten;
+    typedef functional::make_pair   _make_pair;
+    typedef functional::first       _first;
+    typedef functional::second      _second;
+    typedef functional::pop_front   _at;
+    typedef functional::pop_front   _pop_front;
+    typedef functional::push_front  _push_front;
+    typedef functional::pop_back    _pop_back;
+    typedef functional::push_back   _push_back;
+    typedef functional::reverse     _reverse;
+    typedef functional::eval        _eval;
+    struct _deep_copy;
+
+    typedef functional::make_expr<tag::terminal>           _make_terminal;
+    typedef functional::make_expr<tag::unary_plus>         _make_unary_plus;
+    typedef functional::make_expr<tag::negate>             _make_negate;
+    typedef functional::make_expr<tag::dereference>        _make_dereference;
+    typedef functional::make_expr<tag::complement>         _make_complement;
+    typedef functional::make_expr<tag::address_of>         _make_address_of;
+    typedef functional::make_expr<tag::logical_not>        _make_logical_not;
+    typedef functional::make_expr<tag::pre_inc>            _make_pre_inc;
+    typedef functional::make_expr<tag::pre_dec>            _make_pre_dec;
+    typedef functional::make_expr<tag::post_inc>           _make_post_inc;
+    typedef functional::make_expr<tag::post_dec>           _make_post_dec;
+    typedef functional::make_expr<tag::shift_left>         _make_shift_left;
+    typedef functional::make_expr<tag::shift_right>        _make_shift_right;
+    typedef functional::make_expr<tag::multiplies>         _make_multiplies;
+    typedef functional::make_expr<tag::divides>            _make_divides;
+    typedef functional::make_expr<tag::modulus>            _make_modulus;
+    typedef functional::make_expr<tag::plus>               _make_plus;
+    typedef functional::make_expr<tag::minus>              _make_minus;
+    typedef functional::make_expr<tag::less>               _make_less;
+    typedef functional::make_expr<tag::greater>            _make_greater;
+    typedef functional::make_expr<tag::less_equal>         _make_less_equal;
+    typedef functional::make_expr<tag::greater_equal>      _make_greater_equal;
+    typedef functional::make_expr<tag::equal_to>           _make_equal_to;
+    typedef functional::make_expr<tag::not_equal_to>       _make_not_equal_to;
+    typedef functional::make_expr<tag::logical_or>         _make_logical_or;
+    typedef functional::make_expr<tag::logical_and>        _make_logical_and;
+    typedef functional::make_expr<tag::bitwise_and>        _make_bitwise_and;
+    typedef functional::make_expr<tag::bitwise_or>         _make_bitwise_or;
+    typedef functional::make_expr<tag::bitwise_xor>        _make_bitwise_xor;
+    typedef functional::make_expr<tag::comma>              _make_comma;
+    typedef functional::make_expr<tag::mem_ptr>            _make_mem_ptr;
+    typedef functional::make_expr<tag::assign>             _make_assign;
+    typedef functional::make_expr<tag::shift_left_assign>  _make_shift_left_assign;
+    typedef functional::make_expr<tag::shift_right_assign> _make_shift_right_assign;
+    typedef functional::make_expr<tag::multiplies_assign>  _make_multiplies_assign;
+    typedef functional::make_expr<tag::divides_assign>     _make_divides_assign;
+    typedef functional::make_expr<tag::modulus_assign>     _make_modulus_assign;
+    typedef functional::make_expr<tag::plus_assign>        _make_plus_assign;
+    typedef functional::make_expr<tag::minus_assign>       _make_minus_assign;
+    typedef functional::make_expr<tag::bitwise_and_assign> _make_bitwise_and_assign;
+    typedef functional::make_expr<tag::bitwise_or_assign>  _make_bitwise_or_assign;
+    typedef functional::make_expr<tag::bitwise_xor_assign> _make_bitwise_xor_assign;
+    typedef functional::make_expr<tag::subscript>          _make_subscript;
+    typedef functional::make_expr<tag::if_else_>           _make_if_else;
+    typedef functional::make_expr<tag::function>           _make_function;
+
+    template<typename T>
+    struct is_callable;
+
+    template<typename T>
+    struct is_transform;
+
+    template<typename T>
+    struct is_aggregate;
+
+    #define BOOST_PROTO_UNEXPR() typedef int proto_is_expr_;
+    #define BOOST_PROTO_CALLABLE() typedef void proto_is_callable_;
+    #define BOOST_PROTO_AGGREGATE() typedef void proto_is_aggregate_;
+    #define BOOST_PROTO_USE_BASIC_EXPR() typedef void proto_use_basic_expr_;
+
+    struct callable
+    {
+        BOOST_PROTO_CALLABLE()
+    };
+
+    namespace envns_
+    {
+        struct key_not_found;
+
+        struct empty_env;
+
+        typedef int empty_state;
+
+        template<typename Tag, typename Value, typename Base = empty_env>
+        struct env;
+
+        struct data_type;
+
+        struct transforms_type;
+    }
+
+    using envns_::key_not_found;
+    using envns_::empty_env;
+    using envns_::empty_state;
+    using envns_::env;
+    using envns_::data_type;
+    using envns_::transforms_type;
+
+    struct external_transform;
+
+    template<typename PrimitiveTransform = void, typename X = void>
+    struct transform;
+
+    template<typename Grammar, typename Fun = Grammar>
+    struct when;
+
+    template<typename Fun>
+    struct otherwise;
+
+    template<typename Fun>
+    struct call;
+
+    template<typename Fun>
+    struct make;
+
+    template<typename PrimitiveTransform>
+    struct protect;
+
+    template<typename T>
+    struct noinvoke;
+
+    template<typename Fun>
+    struct lazy;
+
+    template<typename Sequence, typename State, typename Fun>
+    struct fold;
+
+    template<typename Sequence, typename State, typename Fun>
+    struct reverse_fold;
+
+    // Q: can we replace fold_tree with fold<flatten(_), state, fun> ?
+    // A: once segmented Fusion works well.
+    template<typename Sequence, typename State, typename Fun>
+    struct fold_tree;
+
+    template<typename Sequence, typename State, typename Fun>
+    struct reverse_fold_tree;
+
+    template<typename Grammar, typename Domain = deduce_domain>
+    struct pass_through;
+
+    template<typename Grammar = detail::_default>
+    struct _default;
+
+    struct _expr;
+    struct _state;
+    struct _data;
+
+    struct _value;
+
+    struct _void;
+
+    template<typename T, T I>
+    struct integral_c;
+
+    template<char I>
+    struct char_;
+
+    template<int I>
+    struct int_;
+
+    template<long I>
+    struct long_;
+
+    template<std::size_t I>
+    struct size_t;
+
+    template<int I>
+    struct _child_c;
+
+    typedef _child_c<0> _child0;
+    typedef _child_c<1> _child1;
+    typedef _child0     _child;
+    typedef _child0     _left;
+    typedef _child1     _right;
+
+    // _child2, _child3, _child4, ...
+    #define M0(Z, N, DATA) typedef _child_c<N> BOOST_PP_CAT(_child, N);
+    BOOST_PP_REPEAT_FROM_TO(
+        2
+      , BOOST_PP_DEC(BOOST_PROTO_MAX_ARITY)
+      , M0
+      , ~
+    )
+    #undef M0
+
+    struct _byref;
+    struct _byval;
+
+    template<typename Tag>
+    struct _env_var;
+
+    struct _env;
+
+    template<typename T>
+    struct is_extension;
+
+    namespace exops = exprns_;
+
+}} // namespace boost::proto
+
+#endif