[class.gslice]

# 29 Numerics library [[numerics]](./#numerics)

## 29.6 Numeric arrays [[numarray]](numarray#class.gslice)

### 29.6.6 The gslice class [class.gslice]

#### [29.6.6.1](#overview) Overview [[class.gslice.overview]](class.gslice.overview)

[ð](#lib:gslice)

namespace std {class gslice {public: gslice();
 gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d);

 size_t start() const;
 valarray<size_t> size() const;
 valarray<size_t> stride() const; };}

[1](#overview-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8619)

This class represents a generalized slice out of an array[.](#overview-1.sentence-1)

Agslice is defined by a starting offset (s),
a set of lengths (lj),
and a set of strides (dj)[.](#overview-1.sentence-2)

The number of lengths shall equal the number of strides[.](#overview-1.sentence-3)

[2](#overview-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8628)

Agslice represents a mapping from a set of indices (ij),
equal in number to the number of strides, to a single index k[.](#overview-2.sentence-1)

It is useful for building multidimensional array classes using
thevalarray template, which is one-dimensional[.](#overview-2.sentence-2)

The set of one-dimensional index values specified by a gslice are  
k=s+âjijdj where the multidimensional indices ij range in value from
0 to lijâ1[.](#overview-2.sentence-3)

[3](#overview-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8642)

[*Example [1](#overview-example-1)*:

Thegslice specificationstart = 3 length = {2, 4, 3} stride = {19, 4, 1} yields the sequence of one-dimensional indices  
k=3+(0,1)Ã19+(0,1,2,3)Ã4+(0,1,2)Ã1 which are ordered as shown in the following table:

```
	(i0,i1,i2,k)=
		(0,  0,  0,   3),    
		(0,  0,  1,   4),    
		(0,  0,  2,   5),    
		(0,  1,  0,   7),    
		(0,  1,  1,   8),    
		(0,  1,  2,   9),    
		(0,  2,  0,  11), 
		(0,  2,  1,  12), 
		(0,  2,  2,  13), 
		(0,  3,  0,  15), 
		(0,  3,  1,  16), 
		(0,  3,  2,  17), 
		(1,  0,  0,  22), 
		(1,  0,  1,  23), 
		…      
		(1,  3,  2,  36)

```

That is, the highest-ordered index turns fastest[.](#overview-3.sentence-2)

â *end example*]

[4](#overview-4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8680)

It is possible to have degenerate generalized slices in which an address
is repeated[.](#overview-4.sentence-1)

[5](#overview-5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8684)

[*Example [2](#overview-example-2)*:

If the stride parameters in the previous
example are changed to {1, 1, 1}, the first few elements of the
resulting sequence of indices will be

```
	(0,  0,  0,   3),  
	(0,  0,  1,   4),  
	(0,  0,  2,   5),  
	(0,  1,  0,   4),  
	(0,  1,  1,   5),  
	(0,  1,  2,   6),  
	…

```
 â *end example*]

[6](#overview-6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8702)

If a degenerate slice is used as the argument to the
non-const version ofoperator[](const gslice&),
the behavior is undefined[.](#overview-6.sentence-1)

#### [29.6.6.2](#gslice.cons) Constructors [[gslice.cons]](gslice.cons)

[ð](#lib:gslice,constructor)

`gslice();
gslice(size_t start, const valarray<size_t>& lengths,
       const valarray<size_t>& strides);
`

[1](#gslice.cons-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8720)

The default constructor is equivalent togslice(0, valarray<size_t>(), valarray<size_t>())[.](#gslice.cons-1.sentence-1)

The constructor with arguments builds agslice based on a specification of start, lengths, and strides, as explained
in the previous subclause[.](#gslice.cons-1.sentence-2)

#### [29.6.6.3](#gslice.access) Access functions [[gslice.access]](gslice.access)

[ð](#lib:start,gslice)

`size_t           start()  const;
valarray<size_t> size() const;
valarray<size_t> stride() const;
`

[1](#gslice.access-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8741)

*Returns*: The representation of the
start, lengths, or strides specified for the gslice[.](#gslice.access-1.sentence-1)

[2](#gslice.access-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L8746)

*Complexity*: start() is constant time[.](#gslice.access-2.sentence-1)

size() and stride() are linear in the number of strides[.](#gslice.access-2.sentence-2)
