diff options
Diffstat (limited to 'src/boost/libs/math/test/functor.hpp')
-rw-r--r-- | src/boost/libs/math/test/functor.hpp | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/src/boost/libs/math/test/functor.hpp b/src/boost/libs/math/test/functor.hpp new file mode 100644 index 00000000..bb0f8645 --- /dev/null +++ b/src/boost/libs/math/test/functor.hpp @@ -0,0 +1,213 @@ +// (C) Copyright John Maddock 2007. +// Use, modification and distribution are subject to 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) + +#include <boost/math/special_functions/trunc.hpp> + + +#ifndef BOOST_MATH_TEST_FUNCTOR_HPP +#define BOOST_MATH_TEST_FUNCTOR_HPP + +template <class Real> +struct extract_result_type +{ + extract_result_type(unsigned i) : m_location(i){} + + template <class S> + Real operator()(const S& row) + { + return row[m_location]; + } +private: + unsigned m_location; +}; + +template <class Real> +inline extract_result_type<Real> extract_result(unsigned i) +{ + return extract_result_type<Real>(i); +} + +template <class Real, class F> +struct row_binder1 +{ + row_binder1(F _f, unsigned i) : f(_f), m_i(i) {} + + template <class S> + Real operator()(const S& row) + { + return f(row[m_i]); + } + +private: + F f; + unsigned m_i; +}; + +template<class Real, class F> +inline row_binder1<Real, F> bind_func(F f, unsigned i) +{ + return row_binder1<Real, F>(f, i); +} + +template <class Real, class F> +struct row_binder2 +{ + row_binder2(F _f, unsigned i, unsigned j) : f(_f), m_i(i), m_j(j) {} + + template <class S> + Real operator()(const S& row) + { + return f(row[m_i], row[m_j]); + } + +private: + F f; + unsigned m_i, m_j; +}; + +template<class Real, class F> +inline row_binder2<Real, F> bind_func(F f, unsigned i, unsigned j) +{ + return row_binder2<Real, F>(f, i, j); +} + +template <class Real, class F> +struct row_binder3 +{ + row_binder3(F _f, unsigned i, unsigned j, unsigned k) : f(_f), m_i(i), m_j(j), m_k(k) {} + + template <class S> + Real operator()(const S& row) + { + return f(row[m_i], row[m_j], row[m_k]); + } + +private: + F f; + unsigned m_i, m_j, m_k; +}; + +template<class Real, class F> +inline row_binder3<Real, F> bind_func(F f, unsigned i, unsigned j, unsigned k) +{ + return row_binder3<Real, F>(f, i, j, k); +} + +template <class Real, class F> +struct row_binder4 +{ + row_binder4(F _f, unsigned i, unsigned j, unsigned k, unsigned l) : f(_f), m_i(i), m_j(j), m_k(k), m_l(l) {} + + template <class S> + Real operator()(const S& row) + { + return f(row[m_i], row[m_j], row[m_k], row[m_l]); + } + +private: + F f; + unsigned m_i, m_j, m_k, m_l; +}; + +template<class Real, class F> +inline row_binder4<Real, F> bind_func(F f, unsigned i, unsigned j, unsigned k, unsigned l) +{ + return row_binder4<Real, F>(f, i, j, k, l); +} + +template <class Real, class F> +struct row_binder2_i1 +{ + row_binder2_i1(F _f, unsigned i, unsigned j) : f(_f), m_i(i), m_j(j) {} + + template <class S> + Real operator()(const S& row) + { + return f(boost::math::itrunc(Real(row[m_i])), row[m_j]); + } + +private: + F f; + unsigned m_i, m_j; +}; + +template<class Real, class F> +inline row_binder2_i1<Real, F> bind_func_int1(F f, unsigned i, unsigned j) +{ + return row_binder2_i1<Real, F>(f, i, j); +} + +template <class Real, class F> +struct row_binder3_i2 +{ + row_binder3_i2(F _f, unsigned i, unsigned j, unsigned k) : f(_f), m_i(i), m_j(j), m_k(k) {} + + template <class S> + Real operator()(const S& row) + { + return f( + boost::math::itrunc(Real(row[m_i])), + boost::math::itrunc(Real(row[m_j])), + row[m_k]); + } + +private: + F f; + unsigned m_i, m_j, m_k; +}; + +template<class Real, class F> +inline row_binder3_i2<Real, F> bind_func_int2(F f, unsigned i, unsigned j, unsigned k) +{ + return row_binder3_i2<Real, F>(f, i, j, k); +} + +template <class Real, class F> +struct row_binder4_i2 +{ + row_binder4_i2(F _f, unsigned i, unsigned j, unsigned k, unsigned l) : f(_f), m_i(i), m_j(j), m_k(k), m_l(l) {} + + template <class S> + Real operator()(const S& row) + { + return f( + boost::math::itrunc(Real(row[m_i])), + boost::math::itrunc(Real(row[m_j])), + row[m_k], + row[m_l]); + } + +private: + F f; + unsigned m_i, m_j, m_k, m_l; +}; + +template<class Real, class F> +inline row_binder4_i2<Real, F> bind_func_int2(F f, unsigned i, unsigned j, unsigned k, unsigned l) +{ + return row_binder4_i2<Real, F>(f, i, j, k, l); +} + +template <class Real, class F> +struct negate_type +{ + negate_type(F f) : m_f(f){} + + template <class S> + Real operator()(const S& row) + { + return -Real(m_f(row)); + } +private: + F m_f; +}; + +template <class Real, class F> +inline negate_type<Real, F> negate(F f) +{ + return negate_type<Real, F>(f); +} + +#endif |