📄 valarray_meta.h
字号:
typedef typename _Op::result_type value_type; _BinBase (const _FirstArg& __e1, const _SecondArg& __e2) : _M_expr1 (__e1), _M_expr2 (__e2) {} value_type operator[] (size_t) const; size_t size () const { return _M_expr1.size (); } private: const _FirstArg& _M_expr1; const _SecondArg& _M_expr2; }; template<template<class> class _Oper, typename _FirstArg, typename _SecondArg> inline typename _BinBase<_Oper,_FirstArg,_SecondArg>::value_type _BinBase<_Oper,_FirstArg,_SecondArg>::operator[] (size_t __i) const { return _Op() (_M_expr1[__i], _M_expr2[__i]); } template<template<class> class _Oper, class _Clos> class _BinBase2 { public: typedef typename _Clos::value_type _Vt; typedef _Oper<_Vt> _Op; typedef typename _Op::result_type value_type; _BinBase2 (const _Clos& __e, const _Vt& __t) : _M_expr1 (__e), _M_expr2 (__t) {} value_type operator[] (size_t) const; size_t size () const { return _M_expr1.size (); } private: const _Clos& _M_expr1; const _Vt& _M_expr2; }; template<template<class> class _Oper, class _Clos> inline typename _BinBase2<_Oper,_Clos>::value_type _BinBase2<_Oper,_Clos>::operator[] (size_t __i) const { return _Op() (_M_expr1[__i], _M_expr2); } template<template<class> class _Oper, class _Clos> class _BinBase1 { public: typedef typename _Clos::value_type _Vt; typedef _Oper<_Vt> _Op; typedef typename _Op::result_type value_type; _BinBase1 (const _Vt& __t, const _Clos& __e) : _M_expr1 (__t), _M_expr2 (__e) {} value_type operator[] (size_t) const; size_t size () const { return _M_expr2.size (); } private: const _Vt& _M_expr1; const _Clos& _M_expr2; }; template<template<class> class _Oper, class _Clos> inline typename _BinBase1<_Oper,_Clos>::value_type _BinBase1<_Oper,_Clos>:: operator[] (size_t __i) const { return _Op() (_M_expr1, _M_expr2[__i]); } template<template<class> class _Oper, class _Dom1, class _Dom2> struct _BinClos<_Oper, _Expr, _Expr, _Dom1, _Dom2> : _BinBase<_Oper,_Dom1,_Dom2> { typedef _BinBase<_Oper,_Dom1,_Dom2> _Base; typedef typename _Base::value_type value_type; _BinClos(const _Dom1& __e1, const _Dom2& __e2) : _Base(__e1, __e2) {} }; template<template<class> class _Oper, typename _Tp> struct _BinClos<_Oper,_ValArray,_ValArray,_Tp,_Tp> : _BinBase<_Oper,valarray<_Tp>,valarray<_Tp> > { typedef _BinBase<_Oper,valarray<_Tp>,valarray<_Tp> > _Base; typedef _Tp value_type; _BinClos (const valarray<_Tp>& __v, const valarray<_Tp>& __w) : _Base (__v, __w) {} }; template<template<class> class _Oper, class _Dom> struct _BinClos<_Oper,_Expr,_ValArray,_Dom,typename _Dom::value_type> : _BinBase<_Oper,_Dom,valarray<typename _Dom::value_type> > { typedef typename _Dom::value_type _Tp; typedef _BinBase<_Oper,_Dom,valarray<_Tp> > _Base; typedef typename _Base::value_type value_type; _BinClos(const _Dom& __e1, const valarray<_Tp>& __e2) : _Base (__e1, __e2) {} }; template<template<class> class _Oper, class _Dom> struct _BinClos<_Oper,_ValArray,_Expr,typename _Dom::value_type,_Dom> : _BinBase<_Oper,valarray<typename _Dom::value_type>,_Dom> { typedef typename _Dom::value_type _Tp; typedef _BinBase<_Oper,valarray<_Tp>,_Dom> _Base; typedef typename _Base::value_type value_type; _BinClos (const valarray<_Tp>& __e1, const _Dom& __e2) : _Base (__e1, __e2) {} }; template<template<class> class _Oper, class _Dom> struct _BinClos<_Oper,_Expr,_Constant,_Dom,typename _Dom::value_type> : _BinBase2<_Oper,_Dom> { typedef typename _Dom::value_type _Tp; typedef _BinBase2<_Oper,_Dom> _Base; typedef typename _Base::value_type value_type; _BinClos (const _Dom& __e1, const _Tp& __e2) : _Base (__e1, __e2) {} }; template<template<class> class _Oper, class _Dom> struct _BinClos<_Oper,_Constant,_Expr,typename _Dom::value_type,_Dom> : _BinBase1<_Oper,_Dom> { typedef typename _Dom::value_type _Tp; typedef _BinBase1<_Oper,_Dom> _Base; typedef typename _Base::value_type value_type; _BinClos (const _Tp& __e1, const _Dom& __e2) : _Base (__e1, __e2) {} }; template<template<class> class _Oper, typename _Tp> struct _BinClos<_Oper,_ValArray,_Constant,_Tp,_Tp> : _BinBase2<_Oper,valarray<_Tp> > { typedef _BinBase2<_Oper,valarray<_Tp> > _Base; typedef typename _Base::value_type value_type; _BinClos (const valarray<_Tp>& __v, const _Tp& __t) : _Base (__v, __t) {} }; template<template<class> class _Oper, typename _Tp> struct _BinClos<_Oper,_Constant,_ValArray,_Tp,_Tp> : _BinBase1<_Oper,valarray<_Tp> > { typedef _BinBase1<_Oper,valarray<_Tp> > _Base; typedef typename _Base::value_type value_type; _BinClos (const _Tp& __t, const valarray<_Tp>& __v) : _Base (__t, __v) {} }; // // slice_array closure. // template<typename _Dom> class _SBase { public: typedef typename _Dom::value_type value_type; _SBase (const _Dom& __e, const slice& __s) : _M_expr (__e), _M_slice (__s) {} value_type operator[] (size_t __i) const { return _M_expr[_M_slice.start () + __i * _M_slice.stride ()]; } size_t size() const { return _M_slice.size (); } private: const _Dom& _M_expr; const slice& _M_slice; }; template<typename _Tp> class _SBase<_Array<_Tp> > { public: typedef _Tp value_type; _SBase (_Array<_Tp> __a, const slice& __s) : _M_array (__a._M_data+__s.start()), _M_size (__s.size()), _M_stride (__s.stride()) {} value_type operator[] (size_t __i) const { return _M_array._M_data[__i * _M_stride]; } size_t size() const { return _M_size; } private: const _Array<_Tp> _M_array; const size_t _M_size; const size_t _M_stride; }; template<class _Dom> struct _SClos<_Expr,_Dom> : _SBase<_Dom> { typedef _SBase<_Dom> _Base; typedef typename _Base::value_type value_type; _SClos (const _Dom& __e, const slice& __s) : _Base (__e, __s) {} }; template<typename _Tp> struct _SClos<_ValArray,_Tp> : _SBase<_Array<_Tp> > { typedef _SBase<_Array<_Tp> > _Base; typedef _Tp value_type; _SClos (_Array<_Tp> __a, const slice& __s) : _Base (__a, __s) {} }; // // gslice_array closure. // template<class _Dom> class _GBase { public: typedef typename _Dom::value_type value_type; _GBase (const _Dom& __e, const valarray<size_t>& __i) : _M_expr (__e), _M_index(__i) {} value_type operator[] (size_t __i) const { return _M_expr[_M_index[__i]]; } size_t size () const { return _M_index.size(); } private: const _Dom& _M_expr; const valarray<size_t>& _M_index; }; template<typename _Tp> class _GBase<_Array<_Tp> > { public: typedef _Tp value_type; _GBase (_Array<_Tp> __a, const valarray<size_t>& __i) : _M_array (__a), _M_index(__i) {} value_type operator[] (size_t __i) const { return _M_array._M_data[_M_index[__i]]; } size_t size () const { return _M_index.size(); } private: const _Array<_Tp> _M_array; const valarray<size_t>& _M_index; }; template<class _Dom> struct _GClos<_Expr,_Dom> : _GBase<_Dom> { typedef _GBase<_Dom> _Base; typedef typename _Base::value_type value_type; _GClos (const _Dom& __e, const valarray<size_t>& __i) : _Base (__e, __i) {} }; template<typename _Tp> struct _GClos<_ValArray,_Tp> : _GBase<_Array<_Tp> > { typedef _GBase<_Array<_Tp> > _Base; typedef typename _Base::value_type value_type; _GClos (_Array<_Tp> __a, const valarray<size_t>& __i) : _Base (__a, __i) {} }; // // indirect_array closure // template<class _Dom> class _IBase { public: typedef typename _Dom::value_type value_type; _IBase (const _Dom& __e, const valarray<size_t>& __i) : _M_expr (__e), _M_index (__i) {} value_type operator[] (size_t __i) const { return _M_expr[_M_index[__i]]; } size_t size() const { return _M_index.size(); } private: const _Dom& _M_expr; const valarray<size_t>& _M_index; }; template<class _Dom> struct _IClos<_Expr,_Dom> : _IBase<_Dom> { typedef _IBase<_Dom> _Base; typedef typename _Base::value_type value_type; _IClos (const _Dom& __e, const valarray<size_t>& __i) : _Base (__e, __i) {} }; template<typename _Tp> struct _IClos<_ValArray,_Tp> : _IBase<valarray<_Tp> > { typedef _IBase<valarray<_Tp> > _Base; typedef _Tp value_type; _IClos (const valarray<_Tp>& __a, const valarray<size_t>& __i) : _Base (__a, __i) {} }; // // class _Expr // template<class _Clos, typename _Tp> class _Expr { public: typedef _Tp value_type; _Expr (const _Clos&); const _Clos& operator() () const; value_type operator[] (size_t) const; valarray<value_type> operator[] (slice) const; valarray<value_type> operator[] (const gslice&) const; valarray<value_type> operator[] (const valarray<bool>&) const; valarray<value_type> operator[] (const valarray<size_t>&) const; _Expr<_UnClos<_Unary_plus,_Expr,_Clos>, value_type> operator+ () const; _Expr<_UnClos<negate,_Expr,_Clos>, value_type> operator- () const; _Expr<_UnClos<_Bitwise_not,_Expr,_Clos>, value_type> operator~ () const; _Expr<_UnClos<logical_not,_Expr,_Clos>, bool> operator! () const; size_t size () const; value_type sum () const; valarray<value_type> shift (int) const; valarray<value_type> cshift (int) const;// _Meta<_ApplyFunctionWithValue<_Expr>, value_type>// apply (value_type _M_func (value_type)) const;// _Meta<_ApplyFunctionWithConstRef<_Expr>, value_type>// apply (value_type _M_func (const value_type&)) const; private: const _Clos _M_closure; }; template<class _Clos, typename _Tp> inline _Expr<_Clos,_Tp>::_Expr (const _Clos& __c) : _M_closure(__c) {} template<class _Clos, typename _Tp> inline const _Clos& _Expr<_Clos,_Tp>::operator() () const { return _M_closure; } template<class _Clos, typename _Tp> inline _Tp _Expr<_Clos,_Tp>::operator[] (size_t __i) const { return _M_closure[__i]; } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos,_Tp>::operator[] (slice __s) const { return _M_closure[__s]; } template<class _Clos, typename _Tp> inline valarray<_Tp> _Expr<_Clos,_Tp>::operator[] (const gslice& __gs) const { return _M_closure[__gs]; } template<class _Clos, typename _Tp> inline valarray<_Tp>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -