valarray.hpp

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

HPP
352
字号
            {                                                                           \                return left Op numeric::promote<std::valarray<right_value_type> >(right);\            }                                                                           \        };        BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP(plus, +)        BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP(minus, -)        BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP(multiplies, *)        BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP(divides, /)        BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP(modulus, %)    #undef BOOST_NUMERIC_FUNCTIONAL_DEFINE_VALARRAY_BIN_OP        ///////////////////////////////////////////////////////////////////////////////        // element-wise min of std::valarray        template<typename Left, typename Right>        struct min_assign<Left, Right, std_valarray_tag, std_valarray_tag>          : std::binary_function<Left, Right, void>        {            void operator ()(Left &left, Right &right) const            {                BOOST_ASSERT(left.size() == right.size());                for(std::size_t i = 0, size = left.size(); i != size; ++i)                {                    if(numeric::less(right[i], left[i]))                    {                        left[i] = right[i];                    }                }            }        };        ///////////////////////////////////////////////////////////////////////////////        // element-wise max of std::valarray        template<typename Left, typename Right>        struct max_assign<Left, Right, std_valarray_tag, std_valarray_tag>          : std::binary_function<Left, Right, void>        {            void operator ()(Left &left, Right &right) const            {                BOOST_ASSERT(left.size() == right.size());                for(std::size_t i = 0, size = left.size(); i != size; ++i)                {                    if(numeric::greater(right[i], left[i]))                    {                        left[i] = right[i];                    }                }            }        };        // partial specialization of numeric::average<> for std::valarray.        template<typename Left, typename Right, typename RightTag>        struct average<Left, Right, std_valarray_tag, RightTag>          : mpl::if_<                are_integral<typename Left::value_type, Right>              , divides<Left, double const>              , divides<Left, Right>            >::type        {};        // promote        template<typename To, typename From>        struct promote<To, From, std_valarray_tag, std_valarray_tag>          : std::unary_function<From, To>        {            To operator ()(From &arr) const            {                typename remove_const<To>::type res(arr.size());                for(std::size_t i = 0, size = arr.size(); i != size; ++i)                {                    res[i] = numeric::promote<typename To::value_type>(arr[i]);                }                return res;            }        };        template<typename ToFrom>        struct promote<ToFrom, ToFrom, std_valarray_tag, std_valarray_tag>          : std::unary_function<ToFrom, ToFrom>        {            ToFrom &operator ()(ToFrom &tofrom) const            {                return tofrom;            }        };        // for "promoting" a std::valarray<bool> to a bool, useful for        // comparing 2 valarrays for equality:        //   if(numeric::promote<bool>(a == b))        template<typename From>        struct promote<bool, From, void, std_valarray_tag>          : std::unary_function<From, bool>        {            bool operator ()(From &arr) const            {                BOOST_MPL_ASSERT((is_same<bool, typename From::value_type>));                for(std::size_t i = 0, size = arr.size(); i != size; ++i)                {                    if(!arr[i])                    {                        return false;                    }                }                return true;            }        };        template<typename From>        struct promote<bool const, From, void, std_valarray_tag>          : promote<bool, From, void, std_valarray_tag>        {};        ///////////////////////////////////////////////////////////////////////////////        // functional::as_min        template<typename T>        struct as_min<T, std_valarray_tag>            : std::unary_function<T, typename remove_const<T>::type>        {            typename remove_const<T>::type operator ()(T &arr) const            {                return 0 == arr.size()                  ? T()                  : T(numeric::as_min(arr[0]), arr.size());            }        };        ///////////////////////////////////////////////////////////////////////////////        // functional::as_max        template<typename T>        struct as_max<T, std_valarray_tag>          : std::unary_function<T, typename remove_const<T>::type>        {            typename remove_const<T>::type operator ()(T &arr) const            {                return 0 == arr.size()                  ? T()                  : T(numeric::as_max(arr[0]), arr.size());            }        };        ///////////////////////////////////////////////////////////////////////////////        // functional::as_zero        template<typename T>        struct as_zero<T, std_valarray_tag>          : std::unary_function<T, typename remove_const<T>::type>        {            typename remove_const<T>::type operator ()(T &arr) const            {                return 0 == arr.size()                  ? T()                  : T(numeric::as_zero(arr[0]), arr.size());            }        };        ///////////////////////////////////////////////////////////////////////////////        // functional::as_one        template<typename T>        struct as_one<T, std_valarray_tag>          : std::unary_function<T, typename remove_const<T>::type>        {            typename remove_const<T>::type operator ()(T &arr) const            {                return 0 == arr.size()                  ? T()                  : T(numeric::as_one(arr[0]), arr.size());            }        };    } // namespace functional}} // namespace boost::numeric#endif

⌨️ 快捷键说明

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