Chris@16: /*============================================================================== Chris@16: Copyright (c) 2011 Steven Watanabe Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: Chris@16: #ifndef BOOST_PHOENIX_CMATH_HPP_INCLUDED Chris@16: #define BOOST_PHOENIX_CMATH_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@101: #if (defined (BOOST_NO_CXX11_DECLTYPE) || \ Chris@101: defined (BOOST_INTEL_CXX_VERSION) || \ Chris@101: (BOOST_GCC_VERSION < 40500) ) Chris@16: #define BOOST_PHOENIX_MATH_FUNCTION(name, n) \ Chris@16: namespace phoenix_impl { \ Chris@16: struct name ## _impl { \ Chris@16: template \ Chris@16: struct result; \ Chris@16: template \ Chris@16: struct result \ Chris@16: { \ Chris@16: typedef \ Chris@16: typename proto::detail::uncvref::type \ Chris@16: type; \ Chris@16: }; \ Chris@16: template \ Chris@16: A0 operator()(BOOST_PHOENIX_A_const_ref_a(n)) const { \ Chris@16: using namespace std; \ Chris@16: return name(BOOST_PHOENIX_a(n)); \ Chris@16: } \ Chris@16: }; \ Chris@16: } \ Chris@16: namespace phoenix { \ Chris@101: BOOST_PHOENIX_ADAPT_CALLABLE(name, phoenix_impl::name ## _impl, n) \ Chris@16: } Chris@101: #else Chris@101: #define BOOST_PHOENIX_MATH_FUNCTION(name, n) \ Chris@101: namespace phoenix_impl { \ Chris@101: struct name ## _impl { \ Chris@101: template \ Chris@101: struct result; \ Chris@101: template \ Chris@101: struct result \ Chris@101: { \ Chris@101: typedef \ Chris@101: decltype( name(typename proto::detail::uncvref::type()) ) \ Chris@101: type; \ Chris@101: }; \ Chris@101: template \ Chris@101: auto operator()(BOOST_PHOENIX_A_const_ref_a(n)) const -> decltype( name(BOOST_PHOENIX_a(n)) ) { \ Chris@101: using namespace std; \ Chris@101: return name(BOOST_PHOENIX_a(n)); \ Chris@101: } \ Chris@101: }; \ Chris@101: } \ Chris@101: namespace phoenix { \ Chris@101: BOOST_PHOENIX_ADAPT_CALLABLE(name, phoenix_impl::name ## _impl, n) \ Chris@101: } Chris@101: #endif Chris@16: Chris@16: BOOST_PHOENIX_MATH_FUNCTION(acos, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(asin, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(atan, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(atan2, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(ceil, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(cos, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(cosh, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(exp, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(fabs, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(floor, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(fmod, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(frexp, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(ldexp, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(log, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(log10, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(modf, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(pow, 2) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(sin, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(sinh, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(sqrt, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(tan, 1) Chris@16: BOOST_PHOENIX_MATH_FUNCTION(tanh, 1) Chris@16: Chris@16: #undef BOOST_PHOENIX_MATH_FUNCTION Chris@16: Chris@16: } Chris@16: Chris@16: #endif