📄 traits.hpp
字号:
}
};
#endif
#ifdef BOOST_UBLAS_USE_BOOST_COMPLEX
template<>
struct type_traits<boost::complex<boost::numeric::interval<float> > > {
typedef type_traits<boost::complex<boost::numeric::interval<float> > > self_type;
typedef boost::complex<boost::numeric::interval<float> > value_type;
typedef const boost::complex<boost::numeric::interval<float> > &const_reference;
typedef boost::complex<boost::numeric::interval<float> > &reference;
typedef boost::numeric::interval<float> real_type;
typedef boost::complex<double> precision_type;
BOOST_STATIC_CONSTANT (std::size_t, plus_complexity = 2);
BOOST_STATIC_CONSTANT (std::size_t, multiplies_complexity = 6);
static
BOOST_UBLAS_INLINE
real_type real (const_reference t) {
// return t.real ();
return std::real (t);
}
static
BOOST_UBLAS_INLINE
real_type imag (const_reference t) {
// return t.imag ();
return std::imag (t);
}
static
BOOST_UBLAS_INLINE
value_type conj (const_reference t) {
// return t.conj ();
return std::conj (t);
}
static
BOOST_UBLAS_INLINE
real_type abs (const_reference t) {
return boost::numeric::abs (t);
}
static
BOOST_UBLAS_INLINE
value_type sqrt (const_reference t) {
return boost::numeric::sqrt (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_1 (const_reference t) {
// Oops, should have known that!
return type_traits<real_type>::abs (self_type::real (t)) +
type_traits<real_type>::abs (self_type::imag (t));
}
static
BOOST_UBLAS_INLINE
real_type norm_2 (const_reference t) {
return self_type::abs (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_inf (const_reference t) {
// Oops, should have known that!
return std::max (type_traits<real_type>::abs (self_type::real (t)),
type_traits<real_type>::abs (self_type::imag (t)));
}
static
BOOST_UBLAS_INLINE
bool equals (const_reference t1, const_reference t2) {
return self_type::norm_inf (t1 - t2) < BOOST_UBLAS_TYPE_CHECK_EPSILON *
std::max (std::max (self_type::norm_inf (t1),
self_type::norm_inf (t2)),
BOOST_UBLAS_TYPE_CHECK_MIN);
}
};
template<>
struct type_traits<boost::complex<double> > {
typedef type_traits<boost::complex<double> > self_type;
typedef boost::complex<double> value_type;
typedef const boost::complex<double> &const_reference;
typedef boost::complex<double> &reference;
typedef double real_type;
#ifndef BOOST_UBLAS_USE_LONG_DOUBLE
typedef boost::complex<double> precision_type;
#else
typedef boost::complex<boost::numeric::interval<long double> > precision_type;
#endif
BOOST_STATIC_CONSTANT (std::size_t, plus_complexity = 2);
BOOST_STATIC_CONSTANT (std::size_t, multiplies_complexity = 6);
static
BOOST_UBLAS_INLINE
real_type real (const_reference t) {
// return t.real ();
return std::real (t);
}
static
BOOST_UBLAS_INLINE
real_type imag (const_reference t) {
// return t.imag ();
return std::imag (t);
}
static
BOOST_UBLAS_INLINE
value_type conj (const_reference t) {
// return t.conj ();
return std::conj (t);
}
static
BOOST_UBLAS_INLINE
real_type abs (const_reference t) {
return boost::numeric::abs (t);
}
static
BOOST_UBLAS_INLINE
value_type sqrt (const_reference t) {
return boost::numeric::sqrt (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_1 (const_reference t) {
// Oops, should have known that!
return type_traits<real_type>::abs (self_type::real (t)) +
type_traits<real_type>::abs (self_type::imag (t));
}
static
BOOST_UBLAS_INLINE
real_type norm_2 (const_reference t) {
return self_type::abs (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_inf (const_reference t) {
// Oops, should have known that!
return std::max (type_traits<real_type>::abs (self_type::real (t)),
type_traits<real_type>::abs (self_type::imag (t)));
}
static
BOOST_UBLAS_INLINE
bool equals (const_reference t1, const_reference t2) {
return self_type::norm_inf (t1 - t2) < BOOST_UBLAS_TYPE_CHECK_EPSILON *
std::max (std::max (self_type::norm_inf (t1),
self_type::norm_inf (t2)),
BOOST_UBLAS_TYPE_CHECK_MIN);
}
};
#ifdef BOOST_UBLAS_USE_LONG_DOUBLE
template<>
struct type_traits<boost::complex<boost::numeric::interval<long double> > > {
typedef type_traits<boost::complex<boost::numeric::interval<long double> > > self_type;
typedef boost::complex<boost::numeric::interval<long double> > value_type;
typedef const boost::complex<boost::numeric::interval<long double> > &const_reference;
typedef boost::complex<boost::numeric::interval<long double> > &reference;
typedef boost::numeric::interval<long double> real_type;
typedef boost::complex<boost::numeric::interval<long double> > precision_type;
BOOST_STATIC_CONSTANT (std::size_t, plus_complexity = 2);
BOOST_STATIC_CONSTANT (std::size_t, multiplies_complexity = 6);
static
BOOST_UBLAS_INLINE
real_type real (const_reference t) {
// return t.real ();
return std::real (t);
}
static
BOOST_UBLAS_INLINE
real_type imag (const_reference t) {
// return t.imag ();
return std::imag (t);
}
static
BOOST_UBLAS_INLINE
value_type conj (const_reference t) {
// return t.conj ();
return std::conj (t);
}
static
BOOST_UBLAS_INLINE
real_type abs (const_reference t) {
return boost::numeric::abs (t);
}
static
BOOST_UBLAS_INLINE
value_type sqrt (const_reference t) {
return boost::numeric::sqrt (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_1 (const_reference t) {
// Oops, should have known that!
return type_traits<real_type>::abs (self_type::real (t)) +
type_traits<real_type>::abs (self_type::imag (t));
}
static
BOOST_UBLAS_INLINE
real_type norm_2 (const_reference t) {
return self_type::abs (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_inf (const_reference t) {
// Oops, should have known that!
return std::max (type_traits<real_type>::abs (self_type::real (t)),
type_traits<real_type>::abs (self_type::imag (t)));
}
static
BOOST_UBLAS_INLINE
bool equals (const_reference t1, const_reference t2) {
return self_type::norm_inf (t1 - t2) < BOOST_UBLAS_TYPE_CHECK_EPSILON *
std::max (std::max (self_type::norm_inf (t1),
self_type::norm_inf (t2)),
BOOST_UBLAS_TYPE_CHECK_MIN);
}
};
#endif
#endif
#endif
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template<class T1, class T2>
struct promote_traits {
typedef boost::mpl::vector<int
, unsigned int
, long
, unsigned long
, float
, double
#ifdef BOOST_UBLAS_USE_LONG_DOUBLE
, long double
#endif
> builtins;
typedef typename boost::mpl::find<builtins, T1>::type iter1;
typedef typename boost::mpl::find<builtins, T2>::type iter2;
typedef typename iter1::pos pos1;
typedef typename iter2::pos pos2;
#ifndef __BORLANDC__
BOOST_STATIC_CONSTANT (int, index1 = pos1::value);
BOOST_STATIC_CONSTANT (int, index2 = pos2::value);
#else
enum { index1 = pos1::value };
enum { index2 = pos2::value };
#endif
typedef typename boost::mpl::if_c<index1 >= index2,
iter1,
iter2>::type iter;
typedef typename iter::type builtin_promote_type;
typedef typename boost::mpl::if_c<boost::is_same<T1, T2>::value,
T1,
builtin_promote_type>::type promote_type;
};
template<class T1, class T2>
struct promote_traits<std::complex<T1>, T2> {
typedef std::complex<typename promote_traits<T1, T2>::promote_type> promote_type;
};
template<class T1, class T2>
struct promote_traits<T1, std::complex<T2> > {
typedef std::complex<typename promote_traits<T1, T2>::promote_type> promote_type;
};
template<class T1, class T2>
struct promote_traits<std::complex<T1>, std::complex<T2> > {
typedef std::complex<typename promote_traits<T1, T2>::promote_type> promote_type;
};
#ifdef BOOST_UBLAS_USE_INTERVAL
template<class T1, class T2>
struct promote_traits<boost::numeric::interval<T1>, T2> {
typedef boost::numeric::interval<typename promote_traits<T1, T2>::promote_type> promote_type;
};
template<class T1, class T2>
struct promote_traits<T1, boost::numeric::interval<T2> > {
typedef boost::numeric::interval<typename promote_traits<T1, T2>::promote_type> promote_type;
};
template<class T1, class T2>
struct promote_traits<boost::numeric::interval<T1>, boost::numeric::interval<T2> > {
typedef boost::numeric::interval<typename promote_traits<T1, T2>::promote_type> promote_type;
};
#endif
#else
template<class T1, class T2>
struct promote_traits {
// Default promotion will badly fail, if the types are different.
// Thanks to Kresimir Fresl for spotting this.
BOOST_STATIC_ASSERT ((boost::is_same<T1, T2>::value));
typedef T1 promote_type;
};
template<>
struct promote_traits<float, double> {
typedef double promote_type;
};
template<>
struct promote_traits<double, float> {
typedef double promote_type;
};
#ifdef BOOST_UBLAS_USE_LONG_DOUBLE
template<>
struct promote_traits<float, long double> {
typedef long double promote_type;
};
template<>
struct promote_traits<long double, float> {
typedef long double promote_type;
};
template<>
struct promote_traits<double, long double> {
typedef long double promote_type;
};
template<>
struct promote_traits<long double, double> {
typedef long double promote_type;
};
#endif
template<>
struct promote_traits<float, std::complex<float> > {
typedef std::complex<float> promote_type;
};
template<>
struct promote_traits<std::complex<float>, float> {
typedef std::complex<float> promote_type;
};
template<>
struct promote_traits<float, std::complex<double> > {
typedef std::complex<double> promote_type;
};
template<>
struct promote_traits<std::complex<double>, float> {
typedef std::complex<double> promote_type;
};
#ifdef BOOST_UBLAS_USE_LONG_DOUBLE
template<>
struct promote_traits<float, std::complex<long double> > {
typedef std::complex<long double> promote_type;
};
template<>
struct promote_traits<std::complex<long double>, float> {
typedef std::complex<long double> promote_type;
};
#endif
template<>
struct promote_traits<double, std::complex<float> > {
// Here we'd better go the conservative way.
// typedef std::complex<float> promote_type;
typedef std::complex<double> promote_type;
};
template<>
struct promote_traits<std::complex<float>, double> {
// Here we'd better go the conservative way.
// typedef std::complex<float> promote_type;
typedef std::complex<double> promote_type;
};
template<>
struct promote_traits<double, std::complex<double> > {
typedef std::complex<double> promote_type;
};
template<>
struct promote_traits<std::complex<double>, double> {
typedef std::complex<double> promote_type;
};
#ifdef BOOST_UBLAS_USE_LONG_DOUBLE
template<>
struct promote_traits<double, std::complex<long double> > {
typedef std::complex<long double> promote_type;
};
template<>
struct promote_traits<std::complex<long double>, double> {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -