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