functional.hpp

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

HPP
1,692
字号
////  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_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>#elsenamespace 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;        };    };    // Vector functors    // Unary returning scalar    template<class V>    struct vector_scalar_unary_functor {        typedef typename V::value_type value_type;        typedef typename V::value_type result_type;    };    template<class V>    struct vector_sum:         public vector_scalar_unary_functor<V> {        typedef typename vector_scalar_unary_functor<V>::value_type value_type;

⌨️ 快捷键说明

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