traits.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 517 行 · 第 1/2 页

HPP
517
字号
////  Copyright (c) 2000-2002//  Joerg Walter, Mathias Koch////  Distributed under 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)////  The authors gratefully acknowledge the support of//  GeNeSys mbH & Co. KG in producing this work.//#ifndef _BOOST_UBLAS_TRAITS_#define _BOOST_UBLAS_TRAITS_#include <iterator>#include <complex>#include <boost/config/no_tr1/cmath.hpp>#include <boost/numeric/ublas/detail/config.hpp>#include <boost/numeric/ublas/detail/iterator.hpp>#include <boost/numeric/ublas/detail/returntype_deduction.hpp>#include <boost/type_traits.hpp>#include <complex>// anonymous namespace to avoid ADL issuesnamespace {  template<class T> T boost_numeric_ublas_sqrt (const T& t) {    using namespace std;    // we'll find either std::sqrt or else another version via ADL:    return sqrt (t);  }  template<class T> T boost_numeric_ublas_abs (const T& t) {    using namespace std;    // we'll find either std::abs or else another version via ADL:    return abs (t);  }}namespace boost { namespace numeric { namespace ublas {    // Use Joel de Guzman's return type deduction    // uBLAS assumes a common return type for all binary arithmetic operators    template<class X, class Y>    struct promote_traits {        typedef type_deduction_detail::base_result_of<X, Y> base_type;        static typename base_type::x_type x;        static typename base_type::y_type y;        static const std::size_t size = sizeof (                type_deduction_detail::test<                    typename base_type::x_type                  , typename base_type::y_type                >(x + y)     // Use x+y to stand of all the arithmetic actions            );        static const std::size_t index = (size / sizeof (char)) - 1;        typedef typename mpl::at_c<            typename base_type::types, index>::type id;        typedef typename id::type promote_type;    };    // Type traits - generic numeric properties and functions    template<class T>    struct type_traits;            // Define properties for a generic scalar type    template<class T>    struct scalar_traits {        typedef scalar_traits<T> self_type;        typedef T value_type;        typedef const T &const_reference;        typedef T &reference;        typedef T 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 real (const_reference t) {                return t;        }        static        BOOST_UBLAS_INLINE        real_type imag (const_reference /*t*/) {                return 0;        }        static        BOOST_UBLAS_INLINE        value_type conj (const_reference t) {                return t;        }        static        BOOST_UBLAS_INLINE        real_type type_abs (const_reference t) {            return boost_numeric_ublas_abs (t);        }        static        BOOST_UBLAS_INLINE        value_type type_sqrt (const_reference t) {            // force a type conversion back to value_type for intgral types            return value_type (boost_numeric_ublas_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 default type traits, assume T is a scalar type    template<class T>    struct type_traits : scalar_traits <T> {        typedef type_traits<T> self_type;        typedef T value_type;        typedef const T &const_reference;        typedef T &reference;        typedef T real_type;        typedef real_type precision_type;        static const unsigned multiplies_complexity = 1;    };    // Define real type traits    template<>    struct type_traits<float> : scalar_traits<float> {        typedef type_traits<float> self_type;        typedef float value_type;        typedef const value_type &const_reference;        typedef value_type &reference;        typedef value_type real_type;        typedef double precision_type;    };    template<>    struct type_traits<double> : scalar_traits<double> {        typedef type_traits<double> self_type;        typedef double value_type;        typedef const value_type &const_reference;        typedef value_type &reference;        typedef value_type real_type;        typedef long double precision_type;    };    template<>    struct type_traits<long double>  : scalar_traits<long double> {        typedef type_traits<long double> self_type;        typedef long double value_type;        typedef const value_type &const_reference;        typedef value_type &reference;        typedef value_type real_type;        typedef value_type precision_type;    };    // Define properties for a generic complex type    template<class T>    struct complex_traits {        typedef complex_traits<T> self_type;        typedef T value_type;        typedef const T &const_reference;        typedef T &reference;        typedef typename T::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 = 2;        static const unsigned multiplies_complexity = 6;        static        BOOST_UBLAS_INLINE        real_type real (const_reference t) {                return std::real (t);        }        static        BOOST_UBLAS_INLINE        real_type imag (const_reference t) {                return std::imag (t);        }        static        BOOST_UBLAS_INLINE        value_type conj (const_reference t) {                return std::conj (t);        }        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 type_traits<real_type>::type_abs (self_type::real (t)) +                   type_traits<real_type>::type_abs (self_type::imag (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 (std::max) (type_traits<real_type>::type_abs (self_type::real (t)),                             type_traits<real_type>::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);        }    };        // Define complex type traits    template<>    struct type_traits<std::complex<float> > : complex_traits<std::complex<float> >{        typedef type_traits<std::complex<float> > self_type;        typedef std::complex<float> value_type;        typedef const value_type &const_reference;        typedef value_type &reference;        typedef float real_type;        typedef std::complex<double> precision_type;    };    template<>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?