mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			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
 |