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