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 
00038 #ifndef _INDIRECT_ARRAY_H
00039 #define _INDIRECT_ARRAY_H 1
00040 
00041 #pragma GCC system_header
00042 
00043 namespace std
00044 {
00060   template <class _Tp>
00061     class indirect_array
00062     {
00063     public:
00064       typedef _Tp value_type;
00065 
00066       
00067       
00068 
00070       indirect_array(const indirect_array&);
00071 
00074       indirect_array& operator=(const indirect_array&);
00075 
00077       void operator=(const valarray<_Tp>&) const;
00079       void operator*=(const valarray<_Tp>&) const;
00081       void operator/=(const valarray<_Tp>&) const;
00083       void operator%=(const valarray<_Tp>&) const;
00085       void operator+=(const valarray<_Tp>&) const;
00087       void operator-=(const valarray<_Tp>&) const;
00089       void operator^=(const valarray<_Tp>&) const;
00091       void operator&=(const valarray<_Tp>&) const;
00093       void operator|=(const valarray<_Tp>&) const;
00095       void operator<<=(const valarray<_Tp>&) const;
00097       void operator>>=(const valarray<_Tp>&) const;
00099       void operator= (const _Tp&) const;
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:
00127       indirect_array(_Array<_Tp>, size_t, _Array<size_t>);
00128 
00129       friend class valarray<_Tp>;
00130       friend class gslice_array<_Tp>;
00131 
00132       const size_t   _M_sz;
00133       const _Array<size_t> _M_index;
00134       const _Array<_Tp>  _M_array;
00135 
00136       
00137       indirect_array();
00138     };
00139 
00140   template<typename _Tp>
00141     inline
00142     indirect_array<_Tp>::indirect_array(const indirect_array<_Tp>& __a)
00143     : _M_sz(__a._M_sz), _M_index(__a._M_index), _M_array(__a._M_array) {}
00144 
00145   template<typename _Tp>
00146     inline
00147     indirect_array<_Tp>::indirect_array(_Array<_Tp> __a, size_t __s,
00148                     _Array<size_t> __i)
00149     : _M_sz(__s), _M_index(__i), _M_array(__a) {}
00150 
00151   template<typename _Tp>
00152     inline indirect_array<_Tp>&
00153     indirect_array<_Tp>::operator=(const indirect_array<_Tp>& __a)
00154     {
00155       std::__valarray_copy(__a._M_array, _M_sz, __a._M_index, _M_array,
00156                _M_index);
00157       return *this;
00158     }
00159 
00160   template<typename _Tp>
00161     inline void
00162     indirect_array<_Tp>::operator=(const _Tp& __t) const
00163     { std::__valarray_fill(_M_array, _M_index, _M_sz, __t); }
00164 
00165   template<typename _Tp>
00166     inline void
00167     indirect_array<_Tp>::operator=(const valarray<_Tp>& __v) const
00168     { std::__valarray_copy(_Array<_Tp>(__v), _M_sz, _M_array, _M_index); }
00169 
00170   template<typename _Tp>
00171     template<class _Dom>
00172       inline void
00173       indirect_array<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) const
00174       { std::__valarray_copy(__e, _M_sz, _M_array, _M_index); }
00175 
00176 #undef _DEFINE_VALARRAY_OPERATOR
00177 #define _DEFINE_VALARRAY_OPERATOR(_Op, _Name)               \
00178   template<typename _Tp>                        \
00179     inline void                             \
00180     indirect_array<_Tp>::operator _Op##=(const valarray<_Tp>& __v) const\
00181     {                                   \
00182       _Array_augmented_##_Name(_M_array, _M_index, _Array<_Tp>(__v), _M_sz); \
00183     }                                   \
00184                                     \
00185   template<typename _Tp>                                                \
00186     template<class _Dom>                                \
00187       inline void                           \
00188       indirect_array<_Tp>::operator _Op##=(const _Expr<_Dom,_Tp>& __e) const\
00189       {                                 \
00190     _Array_augmented_##_Name(_M_array, _M_index, __e, _M_sz);   \
00191       }
00192 
00193 _DEFINE_VALARRAY_OPERATOR(*, __multiplies)
00194 _DEFINE_VALARRAY_OPERATOR(/, __divides)
00195 _DEFINE_VALARRAY_OPERATOR(%, __modulus)
00196 _DEFINE_VALARRAY_OPERATOR(+, __plus)
00197 _DEFINE_VALARRAY_OPERATOR(-, __minus)
00198 _DEFINE_VALARRAY_OPERATOR(^, __bitwise_xor)
00199 _DEFINE_VALARRAY_OPERATOR(&, __bitwise_and)
00200 _DEFINE_VALARRAY_OPERATOR(|, __bitwise_or)
00201 _DEFINE_VALARRAY_OPERATOR(<<, __shift_left)
00202 _DEFINE_VALARRAY_OPERATOR(>>, __shift_right)
00203 
00204 #undef _DEFINE_VALARRAY_OPERATOR
00205 
00206 } 
00207 
00208 #endif 
00209 
00210 
00211 
00212