mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-25 18:10:21 -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
 |