Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // The template and inlines for the -*- C++ -*- gslice_array class.
  2.  
  3. // Copyright (C) 1997-2001 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 2, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // You should have received a copy of the GNU General Public License along
  17. // with this library; see the file COPYING.  If not, write to the Free
  18. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  19. // USA.
  20.  
  21. // As a special exception, you may use this file as part of a free software
  22. // library without restriction.  Specifically, if other files instantiate
  23. // templates or use macros or inline functions from this file, or you compile
  24. // this file and link it with other files to produce an executable, this
  25. // file does not by itself cause the resulting executable to be covered by
  26. // the GNU General Public License.  This exception does not however
  27. // invalidate any other reasons why the executable file might be covered by
  28. // the GNU General Public License.
  29.  
  30. // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
  31.  
  32. #ifndef _CPP_BITS_GSLICE_ARRAY
  33. #define _CPP_BITS_GSLICE_ARRAY 1
  34.  
  35. #pragma GCC system_header
  36.  
  37. namespace std {
  38.  
  39.     template<typename _Tp> class gslice_array
  40.     {
  41.     public:
  42.         typedef _Tp value_type;
  43.  
  44.         void operator=  (const valarray<_Tp>&) const;
  45.         void operator*= (const valarray<_Tp>&) const;
  46.         void operator/= (const valarray<_Tp>&) const;
  47.         void operator%= (const valarray<_Tp>&) const;
  48.         void operator+= (const valarray<_Tp>&) const;
  49.         void operator-= (const valarray<_Tp>&) const;
  50.         void operator^= (const valarray<_Tp>&) const;
  51.         void operator&= (const valarray<_Tp>&) const;
  52.         void operator|= (const valarray<_Tp>&) const;
  53.         void operator<<=(const valarray<_Tp>&) const;
  54.         void operator>>=(const valarray<_Tp>&) const;
  55.         void operator=(const _Tp&);
  56.  
  57.         template<class _Dom>
  58.         void operator= (const _Expr<_Dom,_Tp>&) const;
  59.         template<class _Dom>
  60.         void operator*= (const _Expr<_Dom,_Tp>&) const;
  61.         template<class _Dom>
  62.         void operator/= (const _Expr<_Dom,_Tp>&) const;
  63.         template<class _Dom>
  64.         void operator%= (const _Expr<_Dom,_Tp>&) const;
  65.         template<class _Dom>
  66.         void operator+= (const _Expr<_Dom,_Tp>&) const;
  67.         template<class _Dom>
  68.         void operator-= (const _Expr<_Dom,_Tp>&) const;
  69.         template<class _Dom>
  70.         void operator^= (const _Expr<_Dom,_Tp>&) const;
  71.         template<class _Dom>
  72.         void operator&= (const _Expr<_Dom,_Tp>&) const;
  73.         template<class _Dom>
  74.         void operator|= (const _Expr<_Dom,_Tp>&) const;
  75.         template<class _Dom>
  76.         void operator<<= (const _Expr<_Dom,_Tp>&) const;
  77.         template<class _Dom>
  78.         void operator>>= (const _Expr<_Dom,_Tp>&) const;
  79.        
  80.     private:
  81.         _Array<_Tp>    _M_array;
  82.         const valarray<size_t>& _M_index;
  83.        
  84.         friend class valarray<_Tp>;
  85.        
  86.         gslice_array (_Array<_Tp>, const valarray<size_t>&);
  87.  
  88.         // this constructor needs to be implemented.
  89.         gslice_array (const gslice_array&);
  90.  
  91.         // not implemented
  92.         gslice_array();
  93.         gslice_array& operator= (const gslice_array&);
  94.     };
  95.  
  96.     template<typename _Tp>
  97.     inline
  98.     gslice_array<_Tp>::gslice_array (_Array<_Tp> __a,
  99.                                      const valarray<size_t>& __i)
  100.             : _M_array (__a), _M_index (__i) {}
  101.  
  102.  
  103.     template<typename _Tp>
  104.     inline
  105.     gslice_array<_Tp>::gslice_array (const gslice_array<_Tp>& __a)
  106.             : _M_array (__a._M_array), _M_index (__a._M_index) {}
  107.  
  108.    
  109.     template<typename _Tp>
  110.     inline void
  111.     gslice_array<_Tp>::operator= (const _Tp& __t)
  112.     {
  113.         __valarray_fill (_M_array, _Array<size_t>(_M_index),
  114.                          _M_index.size(), __t);
  115.     }
  116.  
  117.     template<typename _Tp>
  118.     inline void
  119.     gslice_array<_Tp>::operator= (const valarray<_Tp>& __v) const
  120.     {
  121.         __valarray_copy (_Array<_Tp> (__v), __v.size (),
  122.                          _M_array, _Array<size_t>(_M_index));
  123.     }
  124.  
  125.     template<typename _Tp>
  126.     template<class E>
  127.     inline void
  128.     gslice_array<_Tp>::operator= (const _Expr<E, _Tp>& __e) const
  129.     {
  130.         __valarray_copy (__e, _M_index.size(), _M_array,
  131.                          _Array<size_t>(_M_index));
  132.     }
  133.  
  134. #undef _DEFINE_VALARRAY_OPERATOR
  135. #define _DEFINE_VALARRAY_OPERATOR(op, name)                             \
  136. template<typename _Tp>                                                  \
  137. inline void                                                             \
  138. gslice_array<_Tp>::operator op##= (const valarray<_Tp>& __v) const      \
  139. {                                                                       \
  140.     _Array_augmented_##name (_M_array, _Array<size_t>(_M_index),        \
  141.                               _Array<_Tp> (__v), __v.size ());          \
  142. }                                                                       \
  143.                                                                         \
  144. template<typename _Tp> template<class E>                                \
  145. inline void                                                             \
  146. gslice_array<_Tp>::operator op##= (const _Expr<E, _Tp>& __e) const      \
  147. {                                                                       \
  148.     _Array_augmented_##name (_M_array, _Array<size_t>(_M_index), __e,   \
  149.                               _M_index.size());                         \
  150. }
  151.  
  152. _DEFINE_VALARRAY_OPERATOR(*, multiplies)
  153. _DEFINE_VALARRAY_OPERATOR(/, divides)    
  154. _DEFINE_VALARRAY_OPERATOR(%, modulus)
  155. _DEFINE_VALARRAY_OPERATOR(+, plus)    
  156. _DEFINE_VALARRAY_OPERATOR(-, minus)
  157. _DEFINE_VALARRAY_OPERATOR(^, xor)
  158. _DEFINE_VALARRAY_OPERATOR(&, and)
  159. _DEFINE_VALARRAY_OPERATOR(|, or)
  160. _DEFINE_VALARRAY_OPERATOR(<<, shift_left)
  161. _DEFINE_VALARRAY_OPERATOR(>>, shift_right)
  162.  
  163. #undef _DEFINE_VALARRAY_OPERATOR
  164.  
  165. } // std::
  166.  
  167. #endif /* _CPP_BITS_GSLICE_ARRAY */
  168.  
  169. // Local Variables:
  170. // mode:c++
  171. // End:
  172.