📄 functional.hpp
字号:
//
// Copyright (c) 2000-2002
// Joerg Walter, Mathias Koch
//
// Permission to use, copy, modify, distribute and sell this software
// and its documentation for any purpose is hereby granted without fee,
// provided that the above copyright notice appear in all copies and
// that both that copyright notice and this permission notice appear
// in supporting documentation. The authors make no representations
// about the suitability of this software for any purpose.
// It is provided "as is" without express or implied warranty.
//
// The authors gratefully acknowledge the support of
// GeNeSys mbH & Co. KG in producing this work.
//
#ifndef _BOOST_UBLAS_FUNCTIONAL_
#define _BOOST_UBLAS_FUNCTIONAL_
#include <functional>
#include <boost/numeric/ublas/traits.hpp>
#ifdef BOOST_UBLAS_USE_DUFF_DEVICE
#include <boost/numeric/ublas/detail/duff.hpp>
#endif
#ifdef BOOST_UBLAS_USE_SIMD
#include <boost/numeric/ublas/detail/raw.hpp>
#else
namespace boost { namespace numeric { namespace ublas { namespace raw {
}}}}
#endif
#ifdef BOOST_UBLAS_HAVE_BINDINGS
#include <boost/numeric/bindings/traits/std_vector.hpp>
#include <boost/numeric/bindings/traits/ublas_vector.hpp>
#include <boost/numeric/bindings/traits/ublas_matrix.hpp>
#include <boost/numeric/bindings/atlas/cblas.hpp>
#endif
#include <boost/numeric/ublas/detail/definitions.hpp>
namespace boost { namespace numeric { namespace ublas {
// Scalar functors
// Unary
template<class T>
struct scalar_unary_functor {
typedef T value_type;
typedef typename type_traits<T>::const_reference argument_type;
typedef typename type_traits<T>::value_type result_type;
};
template<class T>
struct scalar_identity:
public scalar_unary_functor<T> {
typedef typename scalar_unary_functor<T>::argument_type argument_type;
typedef typename scalar_unary_functor<T>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument_type t) {
return t;
}
};
template<class T>
struct scalar_negate:
public scalar_unary_functor<T> {
typedef typename scalar_unary_functor<T>::argument_type argument_type;
typedef typename scalar_unary_functor<T>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument_type t) {
return - t;
}
};
template<class T>
struct scalar_conj:
public scalar_unary_functor<T> {
typedef typename scalar_unary_functor<T>::value_type value_type;
typedef typename scalar_unary_functor<T>::argument_type argument_type;
typedef typename scalar_unary_functor<T>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument_type t) {
return type_traits<value_type>::conj (t);
}
};
// Unary returning real
template<class T>
struct scalar_real_unary_functor {
typedef T value_type;
typedef typename type_traits<T>::const_reference argument_type;
typedef typename type_traits<T>::real_type result_type;
};
template<class T>
struct scalar_real:
public scalar_real_unary_functor<T> {
typedef typename scalar_real_unary_functor<T>::value_type value_type;
typedef typename scalar_real_unary_functor<T>::argument_type argument_type;
typedef typename scalar_real_unary_functor<T>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument_type t) {
return type_traits<value_type>::real (t);
}
};
template<class T>
struct scalar_imag:
public scalar_real_unary_functor<T> {
typedef typename scalar_real_unary_functor<T>::value_type value_type;
typedef typename scalar_real_unary_functor<T>::argument_type argument_type;
typedef typename scalar_real_unary_functor<T>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument_type t) {
return type_traits<value_type>::imag (t);
}
};
// Binary
template<class T1, class T2>
struct scalar_binary_functor {
typedef typename type_traits<T1>::const_reference argument1_type;
typedef typename type_traits<T2>::const_reference argument2_type;
typedef typename promote_traits<T1, T2>::promote_type result_type;
};
template<class T1, class T2>
struct scalar_plus:
public scalar_binary_functor<T1, T2> {
typedef typename scalar_binary_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_functor<T1, T2>::argument2_type argument2_type;
typedef typename scalar_binary_functor<T1, T2>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument1_type t1, argument2_type t2) {
return t1 + t2;
}
};
template<class T1, class T2>
struct scalar_minus:
public scalar_binary_functor<T1, T2> {
typedef typename scalar_binary_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_functor<T1, T2>::argument2_type argument2_type;
typedef typename scalar_binary_functor<T1, T2>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument1_type t1, argument2_type t2) {
return t1 - t2;
}
};
template<class T1, class T2>
struct scalar_multiplies:
public scalar_binary_functor<T1, T2> {
typedef typename scalar_binary_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_functor<T1, T2>::argument2_type argument2_type;
typedef typename scalar_binary_functor<T1, T2>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument1_type t1, argument2_type t2) {
return t1 * t2;
}
};
template<class T1, class T2>
struct scalar_divides:
public scalar_binary_functor<T1, T2> {
typedef typename scalar_binary_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_functor<T1, T2>::argument2_type argument2_type;
typedef typename scalar_binary_functor<T1, T2>::result_type result_type;
static BOOST_UBLAS_INLINE
result_type apply (argument1_type t1, argument2_type t2) {
return t1 / t2;
}
};
template<class T1, class T2>
struct scalar_binary_assign_functor {
// ISSUE Remove reference to avoid reference to reference problems
typedef typename type_traits<typename boost::remove_reference<T1>::type>::reference argument1_type;
typedef typename type_traits<T2>::const_reference argument2_type;
};
struct assign_tag {};
struct computed_assign_tag {};
template<class T1, class T2>
struct scalar_assign:
public scalar_binary_assign_functor<T1, T2> {
typedef typename scalar_binary_assign_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_assign_functor<T1, T2>::argument2_type argument2_type;
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
static const bool computed ;
#else
static const bool computed = false ;
#endif
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
t1 = t2;
}
template<class U1, class U2>
struct rebind {
typedef scalar_assign<U1, U2> other;
};
};
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
template<class T1, class T2>
const bool scalar_assign<T1,T2>::computed = false;
#endif
template<class T1, class T2>
struct scalar_plus_assign:
public scalar_binary_assign_functor<T1, T2> {
typedef typename scalar_binary_assign_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_assign_functor<T1, T2>::argument2_type argument2_type;
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
static const bool computed ;
#else
static const bool computed = true ;
#endif
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
t1 += t2;
}
template<class U1, class U2>
struct rebind {
typedef scalar_plus_assign<U1, U2> other;
};
};
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
template<class T1, class T2>
const bool scalar_plus_assign<T1,T2>::computed = true;
#endif
template<class T1, class T2>
struct scalar_minus_assign:
public scalar_binary_assign_functor<T1, T2> {
typedef typename scalar_binary_assign_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_assign_functor<T1, T2>::argument2_type argument2_type;
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
static const bool computed ;
#else
static const bool computed = true ;
#endif
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
t1 -= t2;
}
template<class U1, class U2>
struct rebind {
typedef scalar_minus_assign<U1, U2> other;
};
};
#if BOOST_WORKAROUND( __IBMCPP__, <=600 )
template<class T1, class T2>
const bool scalar_minus_assign<T1,T2>::computed = true;
#endif
template<class T1, class T2>
struct scalar_multiplies_assign:
public scalar_binary_assign_functor<T1, T2> {
typedef typename scalar_binary_assign_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_assign_functor<T1, T2>::argument2_type argument2_type;
static const bool computed = true;
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
t1 *= t2;
}
template<class U1, class U2>
struct rebind {
typedef scalar_multiplies_assign<U1, U2> other;
};
};
template<class T1, class T2>
struct scalar_divides_assign:
public scalar_binary_assign_functor<T1, T2> {
typedef typename scalar_binary_assign_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_assign_functor<T1, T2>::argument2_type argument2_type;
static const bool computed ;
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
t1 /= t2;
}
template<class U1, class U2>
struct rebind {
typedef scalar_divides_assign<U1, U2> other;
};
};
template<class T1, class T2>
const bool scalar_divides_assign<T1,T2>::computed = true;
template<class T1, class T2>
struct scalar_binary_swap_functor {
typedef typename type_traits<typename boost::remove_reference<T1>::type>::reference argument1_type;
typedef typename type_traits<typename boost::remove_reference<T2>::type>::reference argument2_type;
};
template<class T1, class T2>
struct scalar_swap:
public scalar_binary_swap_functor<T1, T2> {
typedef typename scalar_binary_swap_functor<T1, T2>::argument1_type argument1_type;
typedef typename scalar_binary_swap_functor<T1, T2>::argument2_type argument2_type;
static BOOST_UBLAS_INLINE
void apply (argument1_type t1, argument2_type t2) {
std::swap (t1, t2);
}
template<class U1, class U2>
struct rebind {
typedef scalar_swap<U1, U2> other;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -