
Module: Standard C++ Library 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
Copyright (c) 1994-2006 Rogue Wave Software, a Quovadx Division.
Licensed under the Apache License, Version 2.0.
Contact Rogue Wave about documentation or support issues. You can also seek help from other developers through the Apache stdcxx community (see below).