📄 valarray_meta.h
字号:
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 (); } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos, _Tp>::shift(int __n) const { return valarray<_Tp>(_M_closure).shift(__n); } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos, _Tp>::cshift(int __n) const { return valarray<_Tp>(_M_closure).cshift(__n); } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const { return valarray<_Tp>(_M_closure).apply(__f); } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const { return valarray<_Tp>(_M_closure).apply(__f); } // 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 _Clos, typename _Tp> inline _Tp _Expr<_Clos, _Tp>::min() const { return __valarray_min(_M_closure); } template<class _Clos, typename _Tp> inline _Tp _Expr<_Clos, _Tp>::max() const { return __valarray_max(_M_closure); } template<class _Dom, typename _Tp> inline _Expr<_UnClos<logical_not,_Expr,_Dom>, bool> _Expr<_Dom,_Tp>::operator! () const { typedef _UnClos<logical_not,std::_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,std::_Expr,_Dom>,_Tp> \_Expr<_Dom,_Tp>::operator _Op () const \{ \ typedef _UnClos<_Name,std::_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(tanh) _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 + -