📄 valarray_meta.h
字号:
_Expr<_Clos,_Tp>::operator[] (const valarray<bool>& __m) const { return _M_closure[__m]; } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos,_Tp>::operator[] (const valarray<size_t>& __i) const { return _M_closure[__i]; } template<class _Clos, typename _Tp> inline size_t _Expr<_Clos,_Tp>::size () const { return _M_closure.size (); } // XXX: replace this with a more robust summation algorithm. template<class _Clos, typename _Tp> inline _Tp _Expr<_Clos,_Tp>::sum () const { size_t __n = _M_closure.size(); if (__n == 0) return _Tp(); else { _Tp __s = _M_closure[--__n]; while (__n != 0) __s += _M_closure[--__n]; return __s; } } template<class _Dom, typename _Tp> inline _Tp min (const _Expr<_Dom,_Tp>& __e) { size_t __s = __e.size (); _Tp __m = __e[0]; for (size_t __i=1; __i<__s; ++__i) if (__m > __e[__i]) __m = __e[__i]; return __m; } template<class _Dom, typename _Tp> inline _Tp max (const _Expr<_Dom,_Tp>& __e) { size_t __s = __e.size(); _Tp __m = __e[0]; for (size_t __i=1; __i<__s; ++__i) if (__m < __e[__i]) __m = __e[__i]; return __m; } template<class _Dom, typename _Tp> inline _Expr<_UnClos<logical_not,_Expr,_Dom>, bool> _Expr<_Dom,_Tp>::operator! () const { typedef _UnClos<logical_not,_Expr,_Dom> _Closure; return _Expr<_Closure,_Tp> (_Closure(this->_M_closure)); }#define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \template<class _Dom, typename _Tp> \inline _Expr<_UnClos<_Name,_Expr,_Dom>,_Tp> \_Expr<_Dom,_Tp>::operator##_Op () const \{ \ typedef _UnClos<_Name,_Expr,_Dom> _Closure; \ return _Expr<_Closure,_Tp> (_Closure (this->_M_closure)); \} _DEFINE_EXPR_UNARY_OPERATOR(+, _Unary_plus) _DEFINE_EXPR_UNARY_OPERATOR(-, negate) _DEFINE_EXPR_UNARY_OPERATOR(~, _Bitwise_not)#undef _DEFINE_EXPR_UNARY_OPERATOR#define _DEFINE_EXPR_BINARY_OPERATOR(_Op, _Name) \template<class _Dom1, class _Dom2> \inline _Expr<_BinClos<_Name,_Expr,_Expr,_Dom1,_Dom2>, \ typename _Name<typename _Dom1::value_type>::result_type> \operator##_Op (const _Expr<_Dom1,typename _Dom1::value_type>& __v, \ const _Expr<_Dom2,typename _Dom2::value_type>& __w) \{ \ typedef typename _Dom1::value_type _Arg; \ typedef typename _Name<_Arg>::result_type _Value; \ typedef _BinClos<_Name,_Expr,_Expr,_Dom1,_Dom2> _Closure; \ return _Expr<_Closure,_Value> (_Closure (__v (), __w ())); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Expr,_Constant,_Dom,typename _Dom::value_type>, \ typename _Name<typename _Dom::value_type>::result_type> \operator##_Op (const _Expr<_Dom,typename _Dom::value_type>& __v, \ const typename _Dom::value_type& __t) \{ \ typedef typename _Dom::value_type _Arg; \ typedef typename _Name<_Arg>::result_type _Value; \ typedef _BinClos<_Name,_Expr,_Constant,_Dom,_Arg> _Closure; \ return _Expr<_Closure,_Value> (_Closure (__v (), __t)); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Constant,_Expr,typename _Dom::value_type,_Dom>, \ typename _Name<typename _Dom::value_type>::result_type> \operator##_Op (const typename _Dom::value_type& __t, \ const _Expr<_Dom,typename _Dom::value_type>& __v) \{ \ typedef typename _Dom::value_type _Arg; \ typedef typename _Name<_Arg>::result_type _Value; \ typedef _BinClos<_Name,_Constant,_Expr,_Arg,_Dom> _Closure; \ return _Expr<_Closure,_Value> (_Closure (__t, __v ())); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Expr,_ValArray,_Dom,typename _Dom::value_type>, \ typename _Name<typename _Dom::value_type>::result_type> \operator##_Op (const _Expr<_Dom,typename _Dom::value_type>& __e, \ const valarray<typename _Dom::value_type>& __v) \{ \ typedef typename _Dom::value_type _Arg; \ typedef typename _Name<_Arg>::result_type _Value; \ typedef _BinClos<_Name,_Expr,_ValArray,_Dom,_Arg> _Closure; \ return _Expr<_Closure,_Value> (_Closure (__e (), __v)); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_ValArray,_Expr,typename _Dom::value_type,_Dom>, \ typename _Name<typename _Dom::value_type>::result_type> \operator##_Op (const valarray<typename _Dom::value_type>& __v, \ const _Expr<_Dom,typename _Dom::value_type>& __e) \{ \ typedef typename _Dom::value_type _Tp; \ typedef typename _Name<_Tp>::result_type _Value; \ typedef _BinClos<_Name,_ValArray,_Expr,_Tp,_Dom> _Closure; \ return _Expr<_Closure,_Value> (_Closure (__v, __e ())); \} _DEFINE_EXPR_BINARY_OPERATOR(+, plus) _DEFINE_EXPR_BINARY_OPERATOR(-, minus) _DEFINE_EXPR_BINARY_OPERATOR(*, multiplies) _DEFINE_EXPR_BINARY_OPERATOR(/, divides) _DEFINE_EXPR_BINARY_OPERATOR(%, modulus) _DEFINE_EXPR_BINARY_OPERATOR(^, _Bitwise_xor) _DEFINE_EXPR_BINARY_OPERATOR(&, _Bitwise_and) _DEFINE_EXPR_BINARY_OPERATOR(|, _Bitwise_or) _DEFINE_EXPR_BINARY_OPERATOR(<<, _Shift_left) _DEFINE_EXPR_BINARY_OPERATOR(>>, _Shift_right)#undef _DEFINE_EXPR_BINARY_OPERATOR #define _DEFINE_EXPR_RELATIONAL_OPERATOR(_Op, _Name) \template<class _Dom1, class _Dom2> \inline _Expr<_BinClos<_Name,_Expr,_Expr,_Dom1,_Dom2>, bool> \operator##_Op (const _Expr<_Dom1,typename _Dom1::value_type>& __v, \ const _Expr<_Dom2,typename _Dom2::value_type>& __w) \{ \ typedef typename _Dom1::value_type _Arg; \ typedef _BinClos<_Name,_Expr,_Expr,_Dom1,_Dom2> _Closure; \ return _Expr<_Closure,bool> (_Closure (__v (), __w ())); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Expr,_Constant,_Dom,typename _Dom::value_type>, \ bool> \operator##_Op (const _Expr<_Dom,typename _Dom::value_type>& __v, \ const typename _Dom::value_type& __t) \{ \ typedef typename _Dom::value_type _Arg; \ typedef _BinClos<_Name,_Expr,_Constant,_Dom,_Arg> _Closure; \ return _Expr<_Closure,bool> (_Closure (__v (), __t)); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Constant,_Expr,typename _Dom::value_type,_Dom>, \ bool> \operator##_Op (const typename _Dom::value_type& __t, \ const _Expr<_Dom,typename _Dom::value_type>& __v) \{ \ typedef typename _Dom::value_type _Arg; \ typedef _BinClos<_Name,_Constant,_Expr,_Arg,_Dom> _Closure; \ return _Expr<_Closure,bool> (_Closure (__t, __v ())); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_Expr,_ValArray,_Dom,typename _Dom::value_type>, \ bool> \operator##_Op (const _Expr<_Dom,typename _Dom::value_type>& __e, \ const valarray<typename _Dom::value_type>& __v) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinClos<_Name,_Expr,_ValArray,_Dom,_Tp> _Closure; \ return _Expr<_Closure,bool> (_Closure (__e (), __v)); \} \ \template<class _Dom> \inline _Expr<_BinClos<_Name,_ValArray,_Expr,typename _Dom::value_type,_Dom>, \ bool> \operator##_Op (const valarray<typename _Dom::value_type>& __v, \ const _Expr<_Dom,typename _Dom::value_type>& __e) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinClos<_Name,_ValArray,_Expr,_Tp,_Dom> _Closure; \ return _Expr<_Closure,bool> (_Closure (__v, __e ())); \} _DEFINE_EXPR_RELATIONAL_OPERATOR(&&, logical_and) _DEFINE_EXPR_RELATIONAL_OPERATOR(||, logical_or) _DEFINE_EXPR_RELATIONAL_OPERATOR(==, equal_to) _DEFINE_EXPR_RELATIONAL_OPERATOR(!=, not_equal_to) _DEFINE_EXPR_RELATIONAL_OPERATOR(<, less) _DEFINE_EXPR_RELATIONAL_OPERATOR(>, greater) _DEFINE_EXPR_RELATIONAL_OPERATOR(<=, less_equal) _DEFINE_EXPR_RELATIONAL_OPERATOR(>=, greater_equal)#undef _DEFINE_EXPR_RELATIONAL_OPERATOR#define _DEFINE_EXPR_UNARY_FUNCTION(_Name) \template<class _Dom> \inline _Expr<_UnFunClos<_Expr,_Dom>,typename _Dom::value_type> \_Name(const _Expr<_Dom,typename _Dom::value_type>& __e) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _UnFunClos<_Expr,_Dom> _Closure; \ return _Expr<_Closure,_Tp>(_Closure(__e(), (_Tp(*)(_Tp))(&_Name))); \} \ \template<typename _Tp> \inline _Expr<_UnFunClos<_ValArray,_Tp>,_Tp> \_Name(const valarray<_Tp>& __v) \{ \ typedef _UnFunClos<_ValArray,_Tp> _Closure; \ return _Expr<_Closure,_Tp> (_Closure (__v, (_Tp(*)(_Tp))(&_Name))); \} _DEFINE_EXPR_UNARY_FUNCTION(abs) _DEFINE_EXPR_UNARY_FUNCTION(cos) _DEFINE_EXPR_UNARY_FUNCTION(acos) _DEFINE_EXPR_UNARY_FUNCTION(cosh) _DEFINE_EXPR_UNARY_FUNCTION(sin) _DEFINE_EXPR_UNARY_FUNCTION(asin) _DEFINE_EXPR_UNARY_FUNCTION(sinh) _DEFINE_EXPR_UNARY_FUNCTION(tan) _DEFINE_EXPR_UNARY_FUNCTION(atan) _DEFINE_EXPR_UNARY_FUNCTION(exp) _DEFINE_EXPR_UNARY_FUNCTION(log) _DEFINE_EXPR_UNARY_FUNCTION(log10) _DEFINE_EXPR_UNARY_FUNCTION(sqrt)#undef _DEFINE_EXPR_UNARY_FUNCTION#define _DEFINE_EXPR_BINARY_FUNCTION(_Name) \template<class _Dom1, class _Dom2> \inline _Expr<_BinFunClos<_Expr,_Expr,_Dom1,_Dom2>,typename _Dom1::value_type>\_Name (const _Expr<_Dom1,typename _Dom1::value_type>& __e1, \ const _Expr<_Dom2,typename _Dom2::value_type>& __e2) \{ \ typedef typename _Dom1::value_type _Tp; \ typedef _BinFunClos<_Expr,_Expr,_Dom1,_Dom2> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__e1 (), __e2 (), (_Tp(*)(_Tp, _Tp))(&_Name))); \} \ \template<class _Dom> \inline _Expr<_BinFunClos<_Expr,_ValArray,_Dom,typename _Dom::value_type>, \ typename _Dom::value_type> \_Name (const _Expr<_Dom,typename _Dom::value_type>& __e, \ const valarray<typename _Dom::value_type>& __v) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinFunClos<_Expr,_ValArray,_Dom,_Tp> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__e (), __v, (_Tp(*)(_Tp, _Tp))(&_Name))); \} \ \template<class _Dom> \inline _Expr<_BinFunClos<_ValArray,_Expr,typename _Dom::value_type,_Dom>, \ typename _Dom::value_type> \_Name (const valarray<typename _Dom::valarray>& __v, \ const _Expr<_Dom,typename _Dom::value_type>& __e) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinFunClos<_ValArray,_Expr,_Tp,_Dom> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__v, __e (), (_Tp(*)(_Tp, _Tp))(&_Name))); \} \ \template<class _Dom> \inline _Expr<_BinFunClos<_Expr,_Constant,_Dom,typename _Dom::value_type>, \ typename _Dom::value_type> \_Name (const _Expr<_Dom, typename _Dom::value_type>& __e, \ const typename _Dom::value_type& __t) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinFunClos<_Expr,_Constant,_Dom,_Tp> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__e (), __t, (_Tp(*)(_Tp, _Tp))(&_Name))); \} \ \template<class _Dom> \inline _Expr<_BinFunClos<_Constant,_Expr,typename _Dom::value_type,_Dom>, \ typename _Dom::value_type> \_Name (const typename _Dom::value_type& __t, \ const _Expr<_Dom,typename _Dom::value_type>& __e) \{ \ typedef typename _Dom::value_type _Tp; \ typedef _BinFunClos<_Constant,_Expr,_Tp,_Dom> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__t, __e (), (_Tp(*)(_Tp, _Tp))(&_Name))); \} \ \template<typename _Tp> \inline _Expr<_BinFunClos<_ValArray,_ValArray,_Tp,_Tp>, _Tp> \_Name (const valarray<_Tp>& __v, const valarray<_Tp>& __w) \{ \ typedef _BinFunClos<_ValArray,_ValArray,_Tp,_Tp> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__v, __w, (_Tp(*)(_Tp,_Tp))(&_Name))); \} \ \template<typename _Tp> \inline _Expr<_BinFunClos<_ValArray,_Constant,_Tp,_Tp>,_Tp> \_Name (const valarray<_Tp>& __v, const _Tp& __t) \{ \ typedef _BinFunClos<_ValArray,_Constant,_Tp,_Tp> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__v, __t, (_Tp(*)(_Tp,_Tp))(&_Name))); \} \ \template<typename _Tp> \inline _Expr<_BinFunClos<_Constant,_ValArray,_Tp,_Tp>,_Tp> \_Name (const _Tp& __t, const valarray<_Tp>& __v) \{ \ typedef _BinFunClos<_Constant,_ValArray,_Tp,_Tp> _Closure; \ return _Expr<_Closure,_Tp> \ (_Closure (__t, __v, (_Tp(*)(_Tp,_Tp))(&_Name))); \}_DEFINE_EXPR_BINARY_FUNCTION(atan2)_DEFINE_EXPR_BINARY_FUNCTION(pow)#undef _DEFINE_EXPR_BINARY_FUNCTION} // std::#endif /* _CPP_VALARRAY_META_H */// Local Variables:// mode:c++// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -