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 #ifndef _CPP_BITS_INDIRECT_ARRAY_H
00033 #define _CPP_BITS_INDIRECT_ARRAY_H 1
00034
00035 #pragma GCC system_header
00036
00037 namespace std {
00038
00039 template <class _Tp> class indirect_array
00040 {
00041 public:
00042 typedef _Tp value_type;
00043
00044 void operator= (const valarray<_Tp>&) const;
00045 void operator*= (const valarray<_Tp>&) const;
00046 void operator/= (const valarray<_Tp>&) const;
00047 void operator%= (const valarray<_Tp>&) const;
00048 void operator+= (const valarray<_Tp>&) const;
00049 void operator-= (const valarray<_Tp>&) const;
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 _Tp&);
00056
00057
00058 template<class _Dom>
00059 void operator= (const _Expr<_Dom, _Tp>&) const;
00060 template<class _Dom>
00061 void operator*= (const _Expr<_Dom, _Tp>&) const;
00062 template<class _Dom>
00063 void operator/= (const _Expr<_Dom, _Tp>&) const;
00064 template<class _Dom>
00065 void operator%= (const _Expr<_Dom, _Tp>&) const;
00066 template<class _Dom>
00067 void operator+= (const _Expr<_Dom, _Tp>&) const;
00068 template<class _Dom>
00069 void operator-= (const _Expr<_Dom, _Tp>&) const;
00070 template<class _Dom>
00071 void operator^= (const _Expr<_Dom, _Tp>&) const;
00072 template<class _Dom>
00073 void operator&= (const _Expr<_Dom, _Tp>&) const;
00074 template<class _Dom>
00075 void operator|= (const _Expr<_Dom, _Tp>&) const;
00076 template<class _Dom>
00077 void operator<<= (const _Expr<_Dom, _Tp>&) const;
00078 template<class _Dom>
00079 void operator>>= (const _Expr<_Dom, _Tp>&) const;
00080
00081 private:
00082 indirect_array (const indirect_array&);
00083 indirect_array (_Array<_Tp>, size_t, _Array<size_t>);
00084
00085 friend class valarray<_Tp>;
00086 friend class gslice_array<_Tp>;
00087
00088 const size_t _M_sz;
00089 const _Array<size_t> _M_index;
00090 const _Array<_Tp> _M_array;
00091
00092
00093 indirect_array ();
00094 indirect_array& operator= (const indirect_array&);
00095 };
00096
00097 template<typename _Tp>
00098 inline indirect_array<_Tp>::indirect_array(const indirect_array<_Tp>& __a)
00099 : _M_sz (__a._M_sz), _M_index (__a._M_index),
00100 _M_array (__a._M_array) {}
00101
00102 template<typename _Tp>
00103 inline
00104 indirect_array<_Tp>::indirect_array (_Array<_Tp> __a, size_t __s,
00105 _Array<size_t> __i)
00106 : _M_sz (__s), _M_index (__i), _M_array (__a) {}
00107
00108
00109
00110
00111 template<typename _Tp>
00112 inline void
00113 indirect_array<_Tp>::operator= (const _Tp& __t)
00114 { __valarray_fill(_M_array, _M_index, _M_sz, __t); }
00115
00116 template<typename _Tp>
00117 inline void
00118 indirect_array<_Tp>::operator= (const valarray<_Tp>& __v) const
00119 { __valarray_copy (_Array<_Tp> (__v), _M_sz, _M_array, _M_index); }
00120
00121 template<typename _Tp>
00122 template<class _Dom>
00123 inline void
00124 indirect_array<_Tp>::operator= (const _Expr<_Dom,_Tp>& __e) const
00125 { __valarray_copy (__e, _M_sz, _M_array, _M_index); }
00126
00127 #undef _DEFINE_VALARRAY_OPERATOR
00128 #define _DEFINE_VALARRAY_OPERATOR(op, name) \
00129 template<typename _Tp> \
00130 inline void \
00131 indirect_array<_Tp>::operator op##= (const valarray<_Tp>& __v) const \
00132 { \
00133 _Array_augmented_##name (_M_array, _M_index, _Array<_Tp> (__v), _M_sz); \
00134 } \
00135 \
00136 template<typename _Tp> template<class _Dom> \
00137 inline void \
00138 indirect_array<_Tp>::operator op##= (const _Expr<_Dom,_Tp>& __e) const \
00139 { \
00140 _Array_augmented_##name (_M_array, _M_index, __e, _M_sz); \
00141 }
00142
00143 _DEFINE_VALARRAY_OPERATOR(*, multiplies)
00144 _DEFINE_VALARRAY_OPERATOR(/, divides)
00145 _DEFINE_VALARRAY_OPERATOR(%, modulus)
00146 _DEFINE_VALARRAY_OPERATOR(+, plus)
00147 _DEFINE_VALARRAY_OPERATOR(-, minus)
00148 _DEFINE_VALARRAY_OPERATOR(^, xor)
00149 _DEFINE_VALARRAY_OPERATOR(&, and)
00150 _DEFINE_VALARRAY_OPERATOR(|, or)
00151 _DEFINE_VALARRAY_OPERATOR(<<, shift_left)
00152 _DEFINE_VALARRAY_OPERATOR(>>, shift_right)
00153
00154 #undef _DEFINE_VALARRAY_OPERATOR
00155
00156 }
00157
00158 #endif
00159
00160
00161
00162