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_MASK_ARRAY_H
00033 #define _CPP_BITS_MASK_ARRAY_H 1
00034
00035 #pragma GCC system_header
00036
00037 namespace std {
00038
00039 template <class _Tp> class mask_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
00059 template<class _Dom>
00060 void operator= (const _Expr<_Dom,_Tp>&) const;
00061 template<class _Dom>
00062 void operator*= (const _Expr<_Dom,_Tp>&) const;
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
00082 private:
00083 mask_array (_Array<_Tp>, size_t, _Array<bool>);
00084 friend class valarray<_Tp>;
00085
00086 const size_t _M_sz;
00087 const _Array<bool> _M_mask;
00088 const _Array<_Tp> _M_array;
00089
00090 mask_array (const mask_array&);
00091
00092
00093 mask_array ();
00094 mask_array& operator= (const mask_array&);
00095 };
00096
00097
00098 template<typename _Tp>
00099 inline mask_array<_Tp>::mask_array (const mask_array<_Tp>& a)
00100 : _M_sz (a._M_sz), _M_mask (a._M_mask), _M_array (a._M_array) {}
00101
00102 template<typename _Tp>
00103 inline
00104 mask_array<_Tp>::mask_array (_Array<_Tp> __a, size_t __s, _Array<bool> __m)
00105 : _M_sz (__s), _M_mask (__m), _M_array (__a) {}
00106
00107
00108
00109
00110 template<typename _Tp>
00111 inline void
00112 mask_array<_Tp>::operator= (const _Tp& __t)
00113 { __valarray_fill (_M_array, _M_sz, _M_mask, __t); }
00114
00115 template<typename _Tp>
00116 inline void
00117 mask_array<_Tp>::operator= (const valarray<_Tp>& __v) const
00118 { __valarray_copy (_Array<_Tp> (__v), __v.size (), _M_array, _M_mask); }
00119
00120 template<typename _Tp>
00121 template<class E>
00122 inline void
00123 mask_array<_Tp>::operator= (const _Expr<E, _Tp>& __e) const
00124 { __valarray_copy (__e, __e.size (), _M_array, _M_mask); }
00125
00126 #undef _DEFINE_VALARRAY_OPERATOR
00127 #define _DEFINE_VALARRAY_OPERATOR(op, name) \
00128 template<typename _Tp> \
00129 inline void \
00130 mask_array<_Tp>::operator op##= (const valarray<_Tp>& __v) const \
00131 { \
00132 _Array_augmented_##name (_M_array, _M_mask, \
00133 _Array<_Tp> (__v), __v.size ()); \
00134 } \
00135 \
00136 template<typename _Tp> template<class E> \
00137 inline void \
00138 mask_array<_Tp>::operator op##= (const _Expr<E, _Tp>& __e) const \
00139 { \
00140 _Array_augmented_##name (_M_array, _M_mask, __e, __e.size ()); \
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