summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/math/test/functor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/math/test/functor.hpp')
-rw-r--r--src/boost/libs/math/test/functor.hpp213
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