




Library: Numerics
Does not inherit
| gslice_array() operator%=() operator&=() | operator>>=() operator<<=() operator*=() | operator+=() operator-=() operator/=() | operator=() operator^=() operator|=() | 
A numeric array class used to represent a BLAS-like slice from a valarray
#include <valarray>
namespace std {
  template <class T>
  class gslice_array;
}
gslice_array creates a gslice view into a valarray. A gslice_array can only be produced by applying the gslice subscript operator to a valarray. The elements in a gslice_array are references to selected elements in the valarray (so changing an element in the gslice_array really changes the corresponding element in the valarray). A gslice_array does not itself hold any distinct elements. The template cannot be instantiated directly since all its constructors are private. However, you can copy a gslice_array to a valarray using either the valarray copy constructor or the assignment operator. Reference semantics are lost at that point.
namespace std{ 
  template <class T> class gslice_array {
  public:
    // types
    typedef T value_type;
    // destructor
    ~gslice_array();
    // public assignment
    void operator=(const valarray<T>& array) const;
    
    // computed assignment
    void operator*=(const valarray<T>& array) const;
    void operator/=(const valarray<T>& array) const;
    void operator%=(const valarray<T>& array) const;
    void operator+=(const valarray<T>& array) const;
    void operator-=(const valarray<T>& array) const;
    void operator^=(const valarray<T>& array) const;
    void operator&=(const valarray<T>& array) const;
    void operator|=(const valarray<T>& array) const;
    void operator<<=(const valarray<T>& array) const;
    void operator>>=(const valarray<T>& array) const;
 
    // fill function
    void operator=(const T&);  
  private:
    
    // constructors
    gslice_array();
    gslice_array(const gslice_array<T>&);
    
    // operator =
    gslice_array<T>& operator= (const gslice_array<T>& array);
  };
}
gslice_array(); gslice_array(const gslice_array&);
All gslice_array constructors are private and cannot be called directly. This prevents copy construction of gslice_arrays.
void operator=(const valarray<T>& x) const;
Assigns values from x to the selected elements of the valarray that self refers to. Remember that a gslice_array never holds any elements itself; it simply refers to selected elements in the valarray used to generate it.
gslice_array<T>& operator=(const gslice_array<T>& x);
Private assignment operator. Cannot be called directly, thus preventing assignment between gslice_arrays.
void operator=(const T& x) const;
Assigns x to the selected elements of the valarray that self refers to.
void operator*=(const valarray<T>& val) const; void operator/=(const valarray<T>& val) const; void operator%=(const valarray<T>& val) const; void operator+=(const valarray<T>& val) const; void operator-=(const valarray<T>& val) const; void operator^=(const valarray<T>& val) const; void operator&=(const valarray<T>& val) const; void operator|=(const valarray<T>& val) const; void operator<<=(const valarray<T>& val) const; void operator>>=(const valarray<T>& val) const;
Applies the indicated operation using elements from val to the selected elements of the valarray that self refers to. Remember that a gslice_array never holds any elements itself; it simply refers to selected elements in the valarray used to generate it.
//
//  gslice_array.cpp
//
#include <valarray.h>  // Includes valarray and 
                       // provides stream inserter.
typedef std::valarray<int> valarray_t;
int main(void) {
  valarray_t::value_type
      ibuf[22] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                   11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 };
  // Create a valarray of ints
  valarray_t  vi (ibuf,(sizeof ibuf / sizeof *ibuf));
  // Print out the valarray
  std::cout << "original valarray vi:\n\n" << vi << "\n\n";
  // Get a two dimensional diagonal slice out of the middle
  size_t length_ary[] = {4, 2};
  size_t stride_ary[] = {4, 6};
  std::valarray<size_t> length_val(length_ary, 2);
  std::valarray<size_t> stride_val(stride_ary, 2);
  // Print out the slices starting at positions 0 and 2
  // respectively.
  std::cout << "vi[gslice(0,[4,2],[4,6])]\n\n"
            << vi[std::gslice(0,length_val,stride_val)] 
            << "\n\n";
  std::cout << "vi[gslice(2,[4,2],[4,6])]\n\n"
            << vi[std::gslice(2,length_val,stride_val)] 
            << "\n\n";
  // Multiply the first slice by the second.
  vi[std::gslice(0,length_val,stride_val)]
      *= static_cast<valarray_t > (vi[std::gslice(2,length_val,
                                                  stride_val)]);
  std::cout << "vi[gslice(0,[4,2],[4,8])] *= " 
            << "vi[gslice(2,[4,2],[4,6])]\n\n"
            << vi << std::endl;
  
  return 0;
  
}
Program Output:
original valarray vi: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21] vi[gslice(0,[4,2],[4,6])] [0,6,4,10,8,14,12,18] vi[gslice(2,[4,2],[4,6])] [2,8,6,12,10,16,14,20] vi[gslice(0,[4,2],[4,8])] *= vi[gslice(2,[4,2],[4,6])] [0,1,2,3,24,5,48,7,80,9,120,11,168,13,224,15,16,17,360,19,20,21]
slice, valarray, gslice, slice_array, mask_array, indirect_array
ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 26.3.7




