diff options
Diffstat (limited to '3rdParty/Boost/src/boost/proto/detail/poly_function.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/proto/detail/poly_function.hpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/proto/detail/poly_function.hpp b/3rdParty/Boost/src/boost/proto/detail/poly_function.hpp new file mode 100644 index 0000000..2bde53b --- /dev/null +++ b/3rdParty/Boost/src/boost/proto/detail/poly_function.hpp @@ -0,0 +1,234 @@ +/////////////////////////////////////////////////////////////////////////////// +/// \file poly_function.hpp +/// A wrapper that makes a tr1-style function object that handles const +/// and non-const refs and reference_wrapper arguments, too, and forwards +/// the arguments on to the specified implementation. +// +// 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_DETAIL_POLY_FUNCTION_EAN_2008_05_02 +#define BOOST_PROTO_DETAIL_POLY_FUNCTION_EAN_2008_05_02 + +#include <boost/ref.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/mpl/void.hpp> +#include <boost/mpl/size_t.hpp> +#include <boost/mpl/eval_if.hpp> +#include <boost/preprocessor/cat.hpp> +#include <boost/preprocessor/facilities/intercept.hpp> +#include <boost/preprocessor/iteration/iterate.hpp> +#include <boost/preprocessor/repetition/enum.hpp> +#include <boost/preprocessor/repetition/enum_params.hpp> +#include <boost/preprocessor/repetition/enum_trailing_params.hpp> +#include <boost/preprocessor/repetition/enum_binary_params.hpp> +#include <boost/proto/proto_fwd.hpp> +#include <boost/proto/detail/is_noncopyable.hpp> + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4181) // const applied to reference type +#endif + +namespace boost { namespace proto { namespace detail +{ + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename T> + struct normalize_arg + { + typedef typename mpl::if_c<is_noncopyable<T>::value, T &, T>::type type; + typedef T &reference; + }; + + template<typename T> + struct normalize_arg<T const> + { + typedef typename mpl::if_c<is_noncopyable<T>::value, T const &, T>::type type; + typedef T const &reference; + }; + + template<typename T> + struct normalize_arg<T &> + { + typedef typename mpl::if_c<is_noncopyable<T>::value, T &, T>::type type; + typedef T &reference; + }; + + template<typename T> + struct normalize_arg<T const &> + { + typedef typename mpl::if_c<is_noncopyable<T>::value, T const &, T>::type type; + typedef T const &reference; + }; + + template<typename T> + struct normalize_arg<boost::reference_wrapper<T> > + { + typedef T &type; + typedef T &reference; + }; + + template<typename T> + struct normalize_arg<boost::reference_wrapper<T> const> + { + typedef T &type; + typedef T &reference; + }; + + template<typename T> + struct normalize_arg<boost::reference_wrapper<T> &> + { + typedef T &type; + typedef T &reference; + }; + + template<typename T> + struct normalize_arg<boost::reference_wrapper<T> const &> + { + typedef T &type; + typedef T &reference; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename T> + struct arg + { + typedef T const &type; + + arg(type t) + : value(t) + {} + + operator type() const + { + return this->value; + } + + type operator()() const + { + return this->value; + } + + private: + arg &operator =(arg const &); + type value; + }; + + template<typename T> + struct arg<T &> + { + typedef T &type; + + arg(type t) + : value(t) + {} + + operator type() const + { + return this->value; + } + + type operator()() const + { + return this->value; + } + + private: + arg &operator =(arg const &); + type value; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename T, typename Void = void> + struct is_poly_function + : mpl::false_ + {}; + + template<typename T> + struct is_poly_function<T, typename T::is_poly_function_base_> + : mpl::true_ + {}; + + //////////////////////////////////////////////////////////////////////////////////////////////// + #define BOOST_PROTO_POLY_FUNCTION() \ + typedef void is_poly_function_base_; \ + /**/ + + //////////////////////////////////////////////////////////////////////////////////////////////// + struct poly_function_base + { + /// INTERNAL ONLY + BOOST_PROTO_POLY_FUNCTION() + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename Derived, typename NullaryResult = void> + struct poly_function + : poly_function_base + { + template<typename Sig> + struct result; + + template<typename This> + struct result<This()> + : Derived::template impl<> + { + typedef typename result::result_type type; + }; + + NullaryResult operator()() const + { + result<Derived const()> impl; + return impl(); + } + + #include <boost/proto/detail/poly_function_funop.hpp> + }; + + template<typename T> + struct wrap_t; + + typedef char poly_function_t; + typedef char (&mono_function_t)[2]; + typedef char (&unknown_function_t)[3]; + + template<typename T> poly_function_t test_poly_function(T *, wrap_t<typename T::is_poly_function_base_> * = 0); + template<typename T> mono_function_t test_poly_function(T *, wrap_t<typename T::result_type> * = 0); + template<typename T> unknown_function_t test_poly_function(T *, ...); + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename Fun, typename Sig, typename Switch = mpl::size_t<sizeof(test_poly_function<Fun>(0,0))> > + struct poly_function_traits + { + typedef typename Fun::template result<Sig>::type result_type; + typedef Fun function_type; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename Fun, typename Sig> + struct poly_function_traits<Fun, Sig, mpl::size_t<sizeof(mono_function_t)> > + { + typedef typename Fun::result_type result_type; + typedef Fun function_type; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename PolyFunSig, bool IsPolyFunction> + struct as_mono_function_impl; + + //////////////////////////////////////////////////////////////////////////////////////////////// + template<typename PolyFunSig> + struct as_mono_function; + + #include <boost/proto/detail/poly_function_traits.hpp> + +}}} // namespace boost::proto::detail + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +#endif + |