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
00032
00033
00034
00035
00036
00037 #ifndef _CPP_BITS_GSLICE_ARRAY
00038 #define _CPP_BITS_GSLICE_ARRAY 1
00039
00040 #pragma GCC system_header
00041
00042 namespace std {
00043
00044 template<typename _Tp>
00045 class gslice_array
00046 {
00047 public:
00048 typedef _Tp value_type;
00049
00050 void operator=(const valarray<_Tp>&) const;
00051 void operator*=(const valarray<_Tp>&) const;
00052 void operator/=(const valarray<_Tp>&) const;
00053 void operator%=(const valarray<_Tp>&) const;
00054 void operator+=(const valarray<_Tp>&) const;
00055 void operator-=(const valarray<_Tp>&) const;
00056 void operator^=(const valarray<_Tp>&) const;
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 _Tp&) const;
00062
00063 template<class _Dom>
00064 void operator=(const _Expr<_Dom,_Tp>&) const;
00065 template<class _Dom>
00066 void operator*=(const _Expr<_Dom,_Tp>&) const;
00067 template<class _Dom>
00068 void operator/=(const _Expr<_Dom,_Tp>&) const;
00069 template<class _Dom>
00070 void operator%=(const _Expr<_Dom,_Tp>&) const;
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
00086 private:
00087 _Array<_Tp> _M_array;
00088 const valarray<size_t>& _M_index;
00089
00090 friend class valarray<_Tp>;
00091
00092 gslice_array(_Array<_Tp>, const valarray<size_t>&);
00093
00094
00095 gslice_array(const gslice_array&);
00096
00097
00098 gslice_array();
00099 gslice_array& operator= (const gslice_array&);
00100 };
00101
00102 template<typename _Tp>
00103 inline
00104 gslice_array<_Tp>::gslice_array(_Array<_Tp> __a,
00105 const valarray<size_t>& __i)
00106 : _M_array(__a), _M_index(__i) {}
00107
00108
00109 template<typename _Tp>
00110 inline
00111 gslice_array<_Tp>::gslice_array(const gslice_array<_Tp>& __a)
00112 : _M_array(__a._M_array), _M_index(__a._M_index) {}
00113
00114
00115 template<typename _Tp>
00116 inline void
00117 gslice_array<_Tp>::operator=(const _Tp& __t) const
00118 {
00119 __valarray_fill(_M_array, _Array<size_t>(_M_index),
00120 _M_index.size(), __t);
00121 }
00122
00123 template<typename _Tp>
00124 inline void
00125 gslice_array<_Tp>::operator=(const valarray<_Tp>& __v) const
00126 {
00127 __valarray_copy(_Array<_Tp>(__v), __v.size(),
00128 _M_array, _Array<size_t>(_M_index));
00129 }
00130
00131 template<typename _Tp>
00132 template<class _Dom>
00133 inline void
00134 gslice_array<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) const
00135 {
00136 __valarray_copy (__e, _M_index.size(), _M_array,
00137 _Array<size_t>(_M_index));
00138 }
00139
00140 #undef _DEFINE_VALARRAY_OPERATOR
00141 #define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
00142 template<typename _Tp> \
00143 inline void \
00144 gslice_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const \
00145 { \
00146 _Array_augmented_##_Name(_M_array, _Array<size_t>(_M_index), \
00147 _Array<_Tp>(__v), __v.size()); \
00148 } \
00149 \
00150 template<typename _Tp> \
00151 template<class _Dom> \
00152 inline void \
00153 gslice_array<_Tp>::operator _Op##= (const _Expr<_Dom, _Tp>& __e) const\
00154 { \
00155 _Array_augmented_##_Name(_M_array, _Array<size_t>(_M_index), __e,\
00156 _M_index.size()); \
00157 }
00158
00159 _DEFINE_VALARRAY_OPERATOR(*, __multiplies)
00160 _DEFINE_VALARRAY_OPERATOR(/, __divides)
00161 _DEFINE_VALARRAY_OPERATOR(%, __modulus)
00162 _DEFINE_VALARRAY_OPERATOR(+, __plus)
00163 _DEFINE_VALARRAY_OPERATOR(-, __minus)
00164 _DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
00165 _DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
00166 _DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
00167 _DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
00168 _DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
00169
00170 #undef _DEFINE_VALARRAY_OPERATOR
00171
00172 }
00173
00174 #endif
00175
00176
00177
00178