887f590fcd
[SVN r76544]
214 lines
4.3 KiB
C++
214 lines
4.3 KiB
C++
// (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
|