// (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 #ifndef BOOST_MATH_TEST_FUNCTOR_HPP #define BOOST_MATH_TEST_FUNCTOR_HPP template struct extract_result_type { extract_result_type(unsigned i) : m_location(i){} template Real operator()(const S& row) { return row[m_location]; } private: unsigned m_location; }; template inline extract_result_type extract_result(unsigned i) { return extract_result_type(i); } template struct row_binder1 { row_binder1(F _f, unsigned i) : f(_f), m_i(i) {} template Real operator()(const S& row) { return f(row[m_i]); } private: F f; unsigned m_i; }; template inline row_binder1 bind_func(F f, unsigned i) { return row_binder1(f, i); } template struct row_binder2 { row_binder2(F _f, unsigned i, unsigned j) : f(_f), m_i(i), m_j(j) {} template Real operator()(const S& row) { return f(row[m_i], row[m_j]); } private: F f; unsigned m_i, m_j; }; template inline row_binder2 bind_func(F f, unsigned i, unsigned j) { return row_binder2(f, i, j); } template 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 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 inline row_binder3 bind_func(F f, unsigned i, unsigned j, unsigned k) { return row_binder3(f, i, j, k); } template 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 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 inline row_binder4 bind_func(F f, unsigned i, unsigned j, unsigned k, unsigned l) { return row_binder4(f, i, j, k, l); } template struct row_binder2_i1 { row_binder2_i1(F _f, unsigned i, unsigned j) : f(_f), m_i(i), m_j(j) {} template 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 inline row_binder2_i1 bind_func_int1(F f, unsigned i, unsigned j) { return row_binder2_i1(f, i, j); } template 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 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 inline row_binder3_i2 bind_func_int2(F f, unsigned i, unsigned j, unsigned k) { return row_binder3_i2(f, i, j, k); } template 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 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 inline row_binder4_i2 bind_func_int2(F f, unsigned i, unsigned j, unsigned k, unsigned l) { return row_binder4_i2(f, i, j, k, l); } template struct negate_type { negate_type(F f) : m_f(f){} template Real operator()(const S& row) { return -Real(m_f(row)); } private: F m_f; }; template inline negate_type negate(F f) { return negate_type(f); } #endif