33 #ifndef _INDIRECT_ARRAY_H
34 #define _INDIRECT_ARRAY_H 1
36 #pragma GCC system_header
38 _GLIBCXX_BEGIN_NAMESPACE(std)
64 typedef _Tp value_type;
70 indirect_array(
const indirect_array&);
74 indirect_array& operator=(
const indirect_array&);
77 void operator=(
const valarray<_Tp>&)
const;
79 void operator*=(
const valarray<_Tp>&)
const;
81 void operator/=(
const valarray<_Tp>&)
const;
83 void operator%=(
const valarray<_Tp>&)
const;
85 void operator+=(
const valarray<_Tp>&)
const;
87 void operator-=(
const valarray<_Tp>&)
const;
89 void operator^=(
const valarray<_Tp>&)
const;
91 void operator&=(
const valarray<_Tp>&)
const;
93 void operator|=(
const valarray<_Tp>&)
const;
95 void operator<<=(const valarray<_Tp>&)
const;
97 void operator>>=(
const valarray<_Tp>&)
const;
99 void operator= (
const _Tp&)
const;
103 void operator=(
const _Expr<_Dom, _Tp>&)
const;
105 void operator*=(
const _Expr<_Dom, _Tp>&)
const;
107 void operator/=(
const _Expr<_Dom, _Tp>&)
const;
109 void operator%=(
const _Expr<_Dom, _Tp>&)
const;
111 void operator+=(
const _Expr<_Dom, _Tp>&)
const;
113 void operator-=(
const _Expr<_Dom, _Tp>&)
const;
115 void operator^=(
const _Expr<_Dom, _Tp>&)
const;
117 void operator&=(
const _Expr<_Dom, _Tp>&)
const;
119 void operator|=(
const _Expr<_Dom, _Tp>&)
const;
121 void operator<<=(const _Expr<_Dom, _Tp>&)
const;
123 void operator>>=(
const _Expr<_Dom, _Tp>&)
const;
127 indirect_array(_Array<_Tp>,
size_t, _Array<size_t>);
129 friend class valarray<_Tp>;
130 friend class gslice_array<_Tp>;
133 const _Array<size_t> _M_index;
134 const _Array<_Tp> _M_array;
140 template<
typename _Tp>
143 : _M_sz(__a._M_sz), _M_index(__a._M_index), _M_array(__a._M_array) {}
145 template<
typename _Tp>
149 : _M_sz(__s), _M_index(__i), _M_array(__a) {}
151 template<
typename _Tp>
152 inline indirect_array<_Tp>&
155 std::__valarray_copy(__a._M_array, _M_sz, __a._M_index, _M_array,
160 template<
typename _Tp>
163 { std::__valarray_fill(_M_array, _M_index, _M_sz, __t); }
165 template<
typename _Tp>
168 { std::__valarray_copy(_Array<_Tp>(__v), _M_sz, _M_array, _M_index); }
170 template<
typename _Tp>
174 { std::__valarray_copy(__e, _M_sz, _M_array, _M_index); }
176 #undef _DEFINE_VALARRAY_OPERATOR
177 #define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
178 template<typename _Tp> \
180 indirect_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const\
182 _Array_augmented_##_Name(_M_array, _M_index, _Array<_Tp>(__v), _M_sz); \
185 template<typename _Tp> \
186 template<class _Dom> \
188 indirect_array<_Tp>::operator _Op##=(const _Expr<_Dom,_Tp>& __e) const\
190 _Array_augmented_##_Name(_M_array, _M_index, __e, _M_sz); \
193 _DEFINE_VALARRAY_OPERATOR(*, __multiplies)
194 _DEFINE_VALARRAY_OPERATOR(/, __divides)
195 _DEFINE_VALARRAY_OPERATOR(%, __modulus)
196 _DEFINE_VALARRAY_OPERATOR(+, __plus)
197 _DEFINE_VALARRAY_OPERATOR(-, __minus)
198 _DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
199 _DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
200 _DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
201 _DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
202 _DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
204 #undef _DEFINE_VALARRAY_OPERATOR
208 _GLIBCXX_END_NAMESPACE