Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file functional_fwd.hpp Chris@16: /// Chris@16: // Copyright 2005 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_NUMERIC_FUNCTIONAL_FWD_HPP_EAN_08_12_2005 Chris@16: #define BOOST_NUMERIC_FUNCTIONAL_FWD_HPP_EAN_08_12_2005 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace numeric Chris@16: { Chris@16: // For using directives -- this namespace may be re-opened elsewhere Chris@16: namespace operators Chris@16: {} Chris@16: Chris@16: namespace op Chris@16: { Chris@16: using mpl::_; Chris@16: using mpl::_1; Chris@16: using mpl::_2; Chris@16: } Chris@16: Chris@16: namespace functional Chris@16: { Chris@16: using namespace operators; Chris@16: Chris@16: template Chris@16: struct tag Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct tag Chris@16: : tag Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct tag Chris@16: : tag Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct tag Chris@16: : tag Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct static_; Chris@16: Chris@16: template Chris@16: struct are_integral; Chris@16: } Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: #define BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP(Name, Op) \ Chris@16: namespace functional \ Chris@16: { \ Chris@16: template \ Chris@16: struct Name ## _base; \ Chris@16: template::type> \ Chris@16: struct Name; \ Chris@16: } \ Chris@16: namespace op \ Chris@16: { \ Chris@16: struct Name; \ Chris@16: } \ Chris@16: namespace \ Chris@16: { \ Chris@16: extern op::Name const &Name; \ Chris@16: } Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: #define BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(Name) \ Chris@16: namespace functional \ Chris@16: { \ Chris@16: template \ Chris@16: struct result_of_ ## Name; \ Chris@16: template \ Chris@16: struct Name ## _base; \ Chris@16: template< \ Chris@16: typename Left \ Chris@16: , typename Right \ Chris@16: , typename LeftTag = typename tag::type \ Chris@16: , typename RightTag = typename tag::type \ Chris@16: > \ Chris@16: struct Name; \ Chris@16: } \ Chris@16: namespace op \ Chris@16: { \ Chris@16: struct Name; \ Chris@16: } \ Chris@16: namespace \ Chris@16: { \ Chris@16: extern op::Name const &Name; \ Chris@16: } Chris@16: Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(plus) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(minus) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(multiplies) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(divides) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(modulus) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(greater) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(greater_equal) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(less) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(less_equal) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(equal_to) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(not_equal_to) Chris@16: Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(assign) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(plus_assign) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(minus_assign) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(multiplies_assign) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(divides_assign) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP(modulus_assign) Chris@16: Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP(unary_plus, +) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP(unary_minus, -) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP(complement, ~) Chris@16: BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP(logical_not, !) Chris@16: Chris@16: #undef BOOST_NUMERIC_FUNCTIONAL_DECLARE_UNARY_OP Chris@16: #undef BOOST_NUMERIC_FUNCTIONAL_DECLARE_BINARY_OP Chris@16: Chris@16: Chris@16: namespace functional Chris@16: { Chris@16: template Chris@16: struct promote_base; Chris@16: template Chris@16: struct min_assign_base; Chris@16: template Chris@16: struct max_assign_base; Chris@16: template Chris@16: struct fdiv_base; Chris@16: template Chris@16: struct as_min_base; Chris@16: template Chris@16: struct as_max_base; Chris@16: template Chris@16: struct as_zero_base; Chris@16: template Chris@16: struct as_one_base; Chris@16: Chris@16: template::type, typename FromTag = typename tag::type> Chris@16: struct promote; Chris@16: template::type, typename RightTag = typename tag::type> Chris@16: struct min_assign; Chris@16: template::type, typename RightTag = typename tag::type> Chris@16: struct max_assign; Chris@16: template::type, typename RightTag = typename tag::type> Chris@16: struct fdiv; Chris@16: template::type> Chris@16: struct as_min; Chris@16: template::type> Chris@16: struct as_max; Chris@16: template::type> Chris@16: struct as_zero; Chris@16: template::type> Chris@16: struct as_one; Chris@16: } Chris@16: Chris@16: namespace op Chris@16: { Chris@16: template Chris@16: struct promote; Chris@16: struct min_assign; Chris@16: struct max_assign; Chris@16: struct fdiv; Chris@16: struct as_min; Chris@16: struct as_max; Chris@16: struct as_zero; Chris@16: struct as_one; Chris@16: } Chris@16: Chris@16: namespace Chris@16: { Chris@16: extern op::min_assign const &min_assign; Chris@16: extern op::max_assign const &max_assign; Chris@16: extern op::fdiv const &fdiv; Chris@16: extern op::as_min const &as_min; Chris@16: extern op::as_max const &as_max; Chris@16: extern op::as_zero const &as_zero; Chris@16: extern op::as_one const &as_one; Chris@16: } Chris@16: Chris@16: template Chris@16: typename lazy_disable_if, mpl::if_, To &, To> >::type Chris@16: promote(From &from); Chris@16: Chris@16: template Chris@16: typename mpl::if_, To const &, To const>::type Chris@16: promote(From const &from); Chris@16: Chris@16: template Chris@16: struct default_; Chris@16: Chris@16: template Chris@16: struct one; Chris@16: Chris@16: template Chris@16: struct zero; Chris@16: Chris@16: template Chris@16: struct one_or_default; Chris@16: Chris@16: template Chris@16: struct zero_or_default; Chris@16: Chris@16: }} // namespace boost::numeric Chris@16: Chris@16: #endif