📄 traits.hpp
字号:
typedef scalar_interval_type_traits<T> self_type;
typedef boost::numeric::interval<float> value_type;
typedef const value_type &const_reference;
typedef value_type &reference;
typedef value_type real_type;
typedef real_type precision_type; // we do not know what type has more precision then the real_type
static const unsigned plus_complexity = 1;
static const unsigned multiplies_complexity = 1;
static
BOOST_UBLAS_INLINE
real_type type_abs (const_reference t) {
return abs (t);
}
static
BOOST_UBLAS_INLINE
value_type type_sqrt (const_reference t) {
return sqrt (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_1 (const_reference t) {
return self_type::type_abs (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_2 (const_reference t) {
return self_type::type_abs (t);
}
static
BOOST_UBLAS_INLINE
real_type norm_inf (const_reference t) {
return self_type::type_abs (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);
}
};
// Define scalar interval type traits
template<>
struct type_traits<boost::numeric::interval<float> > : scalar_interval_type_traits<boost::numeric::interval<float> > {
typedef type_traits<boost::numeric::interval<float> > self_type;
typedef boost::numeric::interval<float> value_type;
typedef const value_type &const_reference;
typedef value_type &reference;
typedef value_type real_type;
typedef boost::numeric::interval<double> precision_type;
};
template<>
struct type_traits<boost::numeric::interval<double> > : scalar_interval_type_traits<boost::numeric::interval<double> > {
typedef type_traits<boost::numeric::interval<double> > self_type;
typedef boost::numeric::interval<double> value_type;
typedef const value_type &const_reference;
typedef value_type &reference;
typedef value_type real_type;
typedef boost::numeric::interval<long double> precision_type;
};
template<>
struct type_traits<boost::numeric::interval<long double> > : scalar_interval_type_traits<boost::numeric::interval<long double> > {
typedef type_traits<boost::numeric::interval<long double> > self_type;
typedef boost::numeric::interval<long double> value_type;
typedef const value_type &const_reference;
typedef value_type &reference;
typedef value_type real_type;
typedef value_type precision_type;
};
#endif
// Storage tags -- hierarchical definition of storage characteristics
struct unknown_storage_tag {};
struct sparse_proxy_tag: public unknown_storage_tag {};
struct sparse_tag: public sparse_proxy_tag {};
struct packed_proxy_tag: public sparse_proxy_tag {};
struct packed_tag: public packed_proxy_tag {};
struct dense_proxy_tag: public packed_proxy_tag {};
struct dense_tag: public dense_proxy_tag {};
template<class S1, class S2>
struct storage_restrict_traits {
typedef S1 storage_category;
};
template<>
struct storage_restrict_traits<sparse_tag, dense_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<sparse_tag, packed_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<sparse_tag, sparse_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<packed_tag, dense_proxy_tag> {
typedef packed_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<packed_tag, packed_proxy_tag> {
typedef packed_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<packed_tag, sparse_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<packed_proxy_tag, sparse_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<dense_tag, dense_proxy_tag> {
typedef dense_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<dense_tag, packed_proxy_tag> {
typedef packed_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<dense_tag, sparse_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<dense_proxy_tag, packed_proxy_tag> {
typedef packed_proxy_tag storage_category;
};
template<>
struct storage_restrict_traits<dense_proxy_tag, sparse_proxy_tag> {
typedef sparse_proxy_tag storage_category;
};
// Iterator tags -- hierarchical definition of storage characteristics
struct sparse_bidirectional_iterator_tag : public std::bidirectional_iterator_tag {};
struct packed_random_access_iterator_tag : public std::random_access_iterator_tag {};
struct dense_random_access_iterator_tag : public packed_random_access_iterator_tag {};
// Thanks to Kresimir Fresl for convincing Comeau with iterator_base_traits ;-)
template<class IC>
struct iterator_base_traits {};
template<>
struct iterator_base_traits<std::forward_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef forward_iterator_base<std::forward_iterator_tag, I, T> type;
};
};
template<>
struct iterator_base_traits<std::bidirectional_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef bidirectional_iterator_base<std::bidirectional_iterator_tag, I, T> type;
};
};
template<>
struct iterator_base_traits<sparse_bidirectional_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef bidirectional_iterator_base<sparse_bidirectional_iterator_tag, I, T> type;
};
};
template<>
struct iterator_base_traits<std::random_access_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef random_access_iterator_base<std::random_access_iterator_tag, I, T> type;
};
};
template<>
struct iterator_base_traits<packed_random_access_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef random_access_iterator_base<packed_random_access_iterator_tag, I, T> type;
};
};
template<>
struct iterator_base_traits<dense_random_access_iterator_tag> {
template<class I, class T>
struct iterator_base {
typedef random_access_iterator_base<dense_random_access_iterator_tag, I, T> type;
};
};
template<class I1, class I2>
struct iterator_restrict_traits {
typedef I1 iterator_category;
};
template<>
struct iterator_restrict_traits<packed_random_access_iterator_tag, sparse_bidirectional_iterator_tag> {
typedef sparse_bidirectional_iterator_tag iterator_category;
};
template<>
struct iterator_restrict_traits<sparse_bidirectional_iterator_tag, packed_random_access_iterator_tag> {
typedef sparse_bidirectional_iterator_tag iterator_category;
};
template<>
struct iterator_restrict_traits<dense_random_access_iterator_tag, sparse_bidirectional_iterator_tag> {
typedef sparse_bidirectional_iterator_tag iterator_category;
};
template<>
struct iterator_restrict_traits<sparse_bidirectional_iterator_tag, dense_random_access_iterator_tag> {
typedef sparse_bidirectional_iterator_tag iterator_category;
};
template<>
struct iterator_restrict_traits<dense_random_access_iterator_tag, packed_random_access_iterator_tag> {
typedef packed_random_access_iterator_tag iterator_category;
};
template<>
struct iterator_restrict_traits<packed_random_access_iterator_tag, dense_random_access_iterator_tag> {
typedef packed_random_access_iterator_tag iterator_category;
};
template<class I>
BOOST_UBLAS_INLINE
void increment (I &it, const I &it_end, typename I::difference_type compare, packed_random_access_iterator_tag) {
it += (std::min) (compare, it_end - it);
}
template<class I>
BOOST_UBLAS_INLINE
void increment (I &it, const I &/* it_end */, typename I::difference_type /* compare */, sparse_bidirectional_iterator_tag) {
++ it;
}
template<class I>
BOOST_UBLAS_INLINE
void increment (I &it, const I &it_end, typename I::difference_type compare) {
increment (it, it_end, compare, typename I::iterator_category ());
}
template<class I>
BOOST_UBLAS_INLINE
void increment (I &it, const I &it_end) {
#if BOOST_UBLAS_TYPE_CHECK
I cit (it);
while (cit != it_end) {
BOOST_UBLAS_CHECK (*cit == typename I::value_type/*zero*/(), internal_logic ());
++ cit;
}
#endif
it = it_end;
}
}}}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -