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