IOLink  IOL_v1.1.0_release
iolink::Indexer Class Referencefinal

This class is used to index a classic array into a multi dimensional array. More...

#include <iolink/Indexer.h>

Public Member Functions

 Indexer (const VectorXu64 &shape, const VectorXu64 &stride, const VectorXu64 &layout)
 Create an indexer by giving all its informations. More...
 
 Indexer (const VectorXu64 &shape, const VectorXu64 &stride, MemoryLayout standardLayout)
 Create an indexer by giving all its informations. More...
 
 Indexer (const VectorXu64 &shape, const VectorXu64 &layout)
 Initialize the indexer using a custom memory layout. More...
 
 Indexer (const VectorXu64 &shape, MemoryLayout standardLayout)
 Auto compute the Indexer's strides from shape and standard layout. More...
 
 Indexer (const VectorXu64 &shape)
 Simpliest way to initialize an indexer from a shape. More...
 
 Indexer (const Indexer &other)
 
Indexeroperator= (const Indexer &other)
 
 Indexer (Indexer &&other) noexcept
 
Indexeroperator= (Indexer &&other) noexcept
 
size_t dimensionCount () const
 The number of dimensions managed by this indexer.
 
const VectorXu64shape () const
 Return the shape.
 
const VectorXu64stride () const
 Return the stride.
 
const VectorXu64layout () const
 Return the layout dimension order.
 
size_t shape (size_t index) const
 Return the current size for given dimension. More...
 
size_t stride (size_t index) const
 Return the current stride for given dimension. More...
 
size_t layout (size_t index) const
 Return the dimension index of the nth one in order. More...
 
size_t elementCount () const
 Returns the number of elements managed by this Indexer.
 
size_t offset (const VectorXu64 &index) const
 Return the computed 1D offset corresponding to indexed sample in multi dimensional array. More...
 

Detailed Description

This class is used to index a classic array into a multi dimensional array.

Its main use is to convert a multi-dimensional index into the corresponding offset in the flat array used for storage. An indexer contains all the needed tools and describes how the data is really stored. The three main elements are: the shape, the stride, and the layout.

The shape is simply the size of the indexed array in each dimension, for example an array with two columns and two rows will have a shape of {2, 2}.

The stride contains the offset between each iteration of a dimension, in elements. For example, our {2, 2} array will usually have a stride of {1, 2}, as each column element is adjacent (hence the stride of one), and when iterating element on a line, you must skip one element on the underlying array (hence the stride of 2). The stride dimension are in the same order as the shape, but they do not have to be in ascendent order. Actually, reverse order arrays (C convention) will have inversed strides, for example, {2, 1} in our {2, 2} array case.

The layout describes in wich order each dimension is ordered internally, and can be used to enhance performance. The usual IOLink layout is {0, 1, ..., n - 1, n}. As we use the Fortran convention in IOLink, indexing a C array would use an inverted layout {n, n-1, ..., 1, 0}. This field enables user to easily know how data is organised without analysing the strides directly.

Constructor & Destructor Documentation

◆ Indexer() [1/5]

iolink::Indexer::Indexer ( const VectorXu64 shape,
const VectorXu64 stride,
const VectorXu64 layout 
)

Create an indexer by giving all its informations.

Here all the arguments are given, and are not checked, so if they are not consistant, they will give an undefined behavior.

Parameters
shapeThe shape of the array to index.
strideThe stride of each dimension, the offset in elements between each increment in this dimension.
layoutThe internal order of dimensions, {0, 1} is row-major and {1, 0} is col-major for example.

◆ Indexer() [2/5]

iolink::Indexer::Indexer ( const VectorXu64 shape,
const VectorXu64 stride,
MemoryLayout  standardLayout 
)

Create an indexer by giving all its informations.

Here all the arguments are given, and are not checked, so if they are not consistant, they will give an undefined behavior.

Parameters
shapeThe shape of the array to index.
strideThe stride of each dimension, the offset in elements between each increment in this dimension.
standardLayoutA standard layout for the array.
Exceptions
ErrorWhen the layout is unsupported

◆ Indexer() [3/5]

iolink::Indexer::Indexer ( const VectorXu64 shape,
const VectorXu64 layout 
)

Initialize the indexer using a custom memory layout.

Parameters
shapeThe shape of the indexed array
layoutThe internal order of dimensions, {0, 1} is row-major and {1, 0} is col-major for example.

◆ Indexer() [4/5]

iolink::Indexer::Indexer ( const VectorXu64 shape,
MemoryLayout  standardLayout 
)

Auto compute the Indexer's strides from shape and standard layout.

Parameters
shapeThe narray sizes in each dimension
standardLayoutA standard layout for the array.
Exceptions
ErrorWhen the layout is unsupported

◆ Indexer() [5/5]

iolink::Indexer::Indexer ( const VectorXu64 shape)
explicit

Simpliest way to initialize an indexer from a shape.

The layout here is Fortran one, and the strides are computed according to it.

Parameters
shapeThe desired shape of the multi dimensional array.

Member Function Documentation

◆ layout()

size_t iolink::Indexer::layout ( size_t  index) const

Return the dimension index of the nth one in order.

Parameters
indexIndex of the order dimension index.

◆ offset()

size_t iolink::Indexer::offset ( const VectorXu64 index) const

Return the computed 1D offset corresponding to indexed sample in multi dimensional array.

Parameters
indexThe element's position for which offset must be computed.

◆ shape()

size_t iolink::Indexer::shape ( size_t  index) const

Return the current size for given dimension.

Parameters
indexIndex of the dimension to consider

◆ stride()

size_t iolink::Indexer::stride ( size_t  index) const

Return the current stride for given dimension.

Parameters
indexIndex of the dimension to consider

The documentation for this class was generated from the following file: