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
00038
#ifndef _MASK_ARRAY_H
00039
#define _MASK_ARRAY_H 1
00040
00041
#pragma GCC system_header
00042
00043
namespace std {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
template <
class _Tp>
00061 class mask_array
00062 {
00063
public:
00064
typedef _Tp value_type;
00065
00066
00067
00068
00069
00070
mask_array (
const mask_array&);
00071
00072
00073
00074
mask_array&
operator=(
const mask_array&);
00075
00076
void operator=(
const valarray<_Tp>&)
const;
00077
00078
void operator*=(
const valarray<_Tp>&)
const;
00079
00080
void operator/=(
const valarray<_Tp>&)
const;
00081
00082
void operator%=(
const valarray<_Tp>&)
const;
00083
00084
void operator+=(
const valarray<_Tp>&)
const;
00085
00086
void operator-=(
const valarray<_Tp>&)
const;
00087
00088
void operator^=(
const valarray<_Tp>&)
const;
00089
00090
void operator&=(
const valarray<_Tp>&)
const;
00091
00092
void operator|=(
const valarray<_Tp>&)
const;
00093
00094
void operator<<=(const valarray<_Tp>&)
const;
00095
00096
void operator>>=(
const valarray<_Tp>&)
const;
00097
00098
void operator=(
const _Tp&)
const;
00099
00100
00101
00102
template<
class _Dom>
00103
void operator=(
const _Expr<_Dom,_Tp>&)
const;
00104
template<
class _Dom>
00105
void operator*=(
const _Expr<_Dom,_Tp>&)
const;
00106
template<
class _Dom>
00107
void operator/=(
const _Expr<_Dom,_Tp>&)
const;
00108
template<
class _Dom>
00109
void operator%=(
const _Expr<_Dom,_Tp>&)
const;
00110
template<
class _Dom>
00111
void operator+=(
const _Expr<_Dom,_Tp>&)
const;
00112
template<
class _Dom>
00113
void operator-=(
const _Expr<_Dom,_Tp>&)
const;
00114
template<
class _Dom>
00115
void operator^=(
const _Expr<_Dom,_Tp>&)
const;
00116
template<
class _Dom>
00117
void operator&=(
const _Expr<_Dom,_Tp>&)
const;
00118
template<
class _Dom>
00119
void operator|=(
const _Expr<_Dom,_Tp>&)
const;
00120
template<
class _Dom>
00121
void operator<<=(const _Expr<_Dom,_Tp>&)
const;
00122
template<
class _Dom>
00123
void operator>>=(
const _Expr<_Dom,_Tp>&)
const;
00124
00125
private:
00126
mask_array(_Array<_Tp>, size_t, _Array<bool>);
00127
friend class valarray<_Tp>;
00128
00129
const size_t _M_sz;
00130
const _Array<bool> _M_mask;
00131
const _Array<_Tp> _M_array;
00132
00133
00134
mask_array();
00135 };
00136
00137
00138
template<
typename _Tp>
00139 inline mask_array<_Tp>::mask_array(
const mask_array<_Tp>& a)
00140 : _M_sz(a._M_sz), _M_mask(a._M_mask), _M_array(a._M_array) {}
00141
00142
template<
typename _Tp>
00143
inline
00144
mask_array<_Tp>::mask_array(_Array<_Tp> __a, size_t __s, _Array<bool> __m)
00145 : _M_sz(__s), _M_mask(__m), _M_array(__a) {}
00146
00147
template<
typename _Tp>
00148
inline mask_array<_Tp>&
00149 mask_array<_Tp>::operator=(
const mask_array<_Tp>& __a)
00150 {
00151 std::__valarray_copy(__a._M_array, __a._M_mask,
00152 _M_sz, _M_array, _M_mask);
00153
return *
this;
00154 }
00155
00156
template<
typename _Tp>
00157
inline void
00158 mask_array<_Tp>::operator=(
const _Tp& __t)
const
00159
{ std::__valarray_fill(_M_array, _M_sz, _M_mask, __t); }
00160
00161
template<
typename _Tp>
00162
inline void
00163
mask_array<_Tp>::operator=(
const valarray<_Tp>& __v)
const
00164
{ std::__valarray_copy(_Array<_Tp>(__v), __v.size(), _M_array, _M_mask); }
00165
00166
template<
typename _Tp>
00167
template<
class _Ex>
00168
inline void
00169 mask_array<_Tp>::operator=(
const _Expr<_Ex, _Tp>& __e)
const
00170
{ std::__valarray_copy(__e, __e.size(), _M_array, _M_mask); }
00171
00172
#undef _DEFINE_VALARRAY_OPERATOR
00173
#define _DEFINE_VALARRAY_OPERATOR(_Op, _Name) \
00174
template<typename _Tp> \
00175
inline void \
00176
mask_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const \
00177
{ \
00178
_Array_augmented_##_Name(_M_array, _M_mask, \
00179
_Array<_Tp>(__v), __v.size()); \
00180
} \
00181
\
00182
template<typename _Tp> \
00183
template<class _Dom> \
00184
inline void \
00185
mask_array<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) const\
00186
{ \
00187
_Array_augmented_##_Name(_M_array, _M_mask, __e, __e.size()); \
00188
}
00189
00190 _DEFINE_VALARRAY_OPERATOR(*, __multiplies)
00191 _DEFINE_VALARRAY_OPERATOR(/, __divides)
00192 _DEFINE_VALARRAY_OPERATOR(%, __modulus)
00193 _DEFINE_VALARRAY_OPERATOR(+, __plus)
00194 _DEFINE_VALARRAY_OPERATOR(-, __minus)
00195 _DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
00196 _DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
00197 _DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
00198 _DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
00199 _DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
00200
00201 #undef _DEFINE_VALARRAY_OPERATOR
00202
00203 }
00204
00205 #endif
00206
00207
00208
00209