00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00037 #ifndef _CPP_BITS_SLICE_ARRAY_H
00038 #define _CPP_BITS_SLICE_ARRAY_H 1
00039
00040 #pragma GCC system_header
00041
00042 namespace std
00043 {
00044
00045 template<typename _Tp>
00046 class slice_array
00047 {
00048 public:
00049 typedef _Tp value_type;
00050
00051
00052 slice_array (const slice_array&);
00053
00054
00055 slice_array& operator= (const slice_array&);
00056
00057 void operator= (const valarray<_Tp>&) const;
00058 void operator*= (const valarray<_Tp>&) const;
00059 void operator/= (const valarray<_Tp>&) const;
00060 void operator%= (const valarray<_Tp>&) const;
00061 void operator+= (const valarray<_Tp>&) const;
00062 void operator-= (const valarray<_Tp>&) const;
00063 void operator^= (const valarray<_Tp>&) const;
00064 void operator&= (const valarray<_Tp>&) const;
00065 void operator|= (const valarray<_Tp>&) const;
00066 void operator<<= (const valarray<_Tp>&) const;
00067 void operator>>= (const valarray<_Tp>&) const;
00068 void operator= (const _Tp &);
00069
00070
00071 template<class _Dom>
00072 void operator= (const _Expr<_Dom,_Tp>&) const;
00073 template<class _Dom>
00074 void operator*= (const _Expr<_Dom,_Tp>&) const;
00075 template<class _Dom>
00076 void operator/= (const _Expr<_Dom,_Tp>&) const;
00077 template<class _Dom>
00078 void operator%= (const _Expr<_Dom,_Tp>&) const;
00079 template<class _Dom>
00080 void operator+= (const _Expr<_Dom,_Tp>&) const;
00081 template<class _Dom>
00082 void operator-= (const _Expr<_Dom,_Tp>&) const;
00083 template<class _Dom>
00084 void operator^= (const _Expr<_Dom,_Tp>&) const;
00085 template<class _Dom>
00086 void operator&= (const _Expr<_Dom,_Tp>&) const;
00087 template<class _Dom>
00088 void operator|= (const _Expr<_Dom,_Tp>&) const;
00089 template<class _Dom>
00090 void operator<<= (const _Expr<_Dom,_Tp>&) const;
00091 template<class _Dom>
00092 void operator>>= (const _Expr<_Dom,_Tp>&) const;
00093
00094 private:
00095 friend class valarray<_Tp>;
00096 slice_array(_Array<_Tp>, const slice&);
00097
00098 const size_t _M_sz;
00099 const size_t _M_stride;
00100 const _Array<_Tp> _M_array;
00101
00102
00103 slice_array ();
00104 };
00105
00106 template<typename _Tp>
00107 inline slice_array<_Tp>::slice_array (_Array<_Tp> __a, const slice& __s)
00108 : _M_sz (__s.size ()), _M_stride (__s.stride ()),
00109 _M_array (__a.begin () + __s.start ()) {}
00110
00111
00112 template<typename _Tp>
00113 inline slice_array<_Tp>::slice_array(const slice_array<_Tp>& a)
00114 : _M_sz(a._M_sz), _M_stride(a._M_stride), _M_array(a._M_array) {}
00115
00116
00117
00118
00119 template<typename _Tp>
00120 inline slice_array<_Tp>&
00121 slice_array<_Tp>::operator=(const slice_array<_Tp>& __a)
00122 {
00123 __valarray_copy(__a._M_array, __a._M_sz, __a._M_stride,
00124 _M_array, _M_stride);
00125 return *this;
00126 }
00127
00128
00129 template<typename _Tp>
00130 inline void
00131 slice_array<_Tp>::operator= (const _Tp& __t)
00132 { __valarray_fill (_M_array, _M_sz, _M_stride, __t); }
00133
00134 template<typename _Tp>
00135 inline void
00136 slice_array<_Tp>::operator= (const valarray<_Tp>& __v) const
00137 { __valarray_copy (_Array<_Tp> (__v), _M_array, _M_sz, _M_stride); }
00138
00139 template<typename _Tp>
00140 template<class _Dom>
00141 inline void
00142 slice_array<_Tp>::operator= (const _Expr<_Dom,_Tp>& __e) const
00143 { __valarray_copy (__e, _M_sz, _M_array, _M_stride); }
00144
00145 #undef _DEFINE_VALARRAY_OPERATOR
00146 #define _DEFINE_VALARRAY_OPERATOR(op, name) \
00147 template<typename _Tp> \
00148 inline void \
00149 slice_array<_Tp>::operator op##= (const valarray<_Tp>& __v) const \
00150 { \
00151 _Array_augmented_##name (_M_array, _M_sz, _M_stride, _Array<_Tp> (__v));\
00152 } \
00153 \
00154 template<typename _Tp> template<class _Dom> \
00155 inline void \
00156 slice_array<_Tp>::operator op##= (const _Expr<_Dom,_Tp>& __e) const \
00157 { \
00158 _Array_augmented_##name (_M_array, _M_stride, __e, _M_sz); \
00159 }
00160
00161
00162 _DEFINE_VALARRAY_OPERATOR(*, multiplies)
00163 _DEFINE_VALARRAY_OPERATOR(/, divides)
00164 _DEFINE_VALARRAY_OPERATOR(%, modulus)
00165 _DEFINE_VALARRAY_OPERATOR(+, plus)
00166 _DEFINE_VALARRAY_OPERATOR(-, minus)
00167 _DEFINE_VALARRAY_OPERATOR(^, xor)
00168 _DEFINE_VALARRAY_OPERATOR(&, and)
00169 _DEFINE_VALARRAY_OPERATOR(|, or)
00170 _DEFINE_VALARRAY_OPERATOR(<<, shift_left)
00171 _DEFINE_VALARRAY_OPERATOR(>>, shift_right)
00172
00173 #undef _DEFINE_VALARRAY_OPERATOR
00174
00175 }
00176
00177 #endif
00178
00179
00180
00181