StIndArray.h

Classes

StIndArray -- Read/write indirect arrays (full description)

class StIndArray

Interface

Public Members
StIndArray (Int64 fileOffset)
StIndArray (const StIndArray&)
StIndArray& operator= (const StIndArray&)
~StIndArray()
const IPosition& shape() const
Int64 fileOffset() const
Bool setShape (StManArrayFile&, int dataType, const IPosition& shape)
void getShape (StManArrayFile& ios)
uInt refCount (StManArrayFile& ios)
void incrementRefCount (StManArrayFile& ios)
void decrementRefCount (StManArrayFile& ios)
void copyData (StManArrayFile& ios, int dataType, const StIndArray& other)
void getArrayBoolV (StManArrayFile&, Array<Bool>* dataPtr)
void getArrayuCharV (StManArrayFile&, Array<uChar>* dataPtr)
void getArrayShortV (StManArrayFile&, Array<Short>* dataPtr)
void getArrayuShortV (StManArrayFile&, Array<uShort>* dataPtr)
void getArrayIntV (StManArrayFile&, Array<Int>* dataPtr)
void getArrayuIntV (StManArrayFile&, Array<uInt>* dataPtr)
void getArrayfloatV (StManArrayFile&, Array<float>* dataPtr)
void getArraydoubleV (StManArrayFile&, Array<double>* dataPtr)
void getArrayComplexV (StManArrayFile&, Array<Complex>* dataPtr)
void getArrayDComplexV (StManArrayFile&, Array<DComplex>* dataPtr)
void getArrayStringV (StManArrayFile&, Array<String>* dataPtr)
void putArrayBoolV (StManArrayFile&, const Array<Bool>* dataPtr)
void putArrayuCharV (StManArrayFile&, const Array<uChar>* dataPtr)
void putArrayShortV (StManArrayFile&, const Array<Short>* dataPtr)
void putArrayuShortV (StManArrayFile&, const Array<uShort>* dataPtr)
void putArrayIntV (StManArrayFile&, const Array<Int>* dataPtr)
void putArrayuIntV (StManArrayFile&, const Array<uInt>* dataPtr)
void putArrayfloatV (StManArrayFile&, const Array<float>* dataPtr)
void putArraydoubleV (StManArrayFile&, const Array<double>* dataPtr)
void putArrayComplexV (StManArrayFile&, const Array<Complex>* dataPtr)
void putArrayDComplexV (StManArrayFile&, const Array<DComplex>* dataPtr)
void putArrayStringV (StManArrayFile&, const Array<String>* dataPtr)
void getSliceBoolV (StManArrayFile&, const Slicer&, Array<Bool>* dataPtr)
void getSliceuCharV (StManArrayFile&, const Slicer&, Array<uChar>* dataPtr)
void getSliceShortV (StManArrayFile&, const Slicer&, Array<Short>* dataPtr)
void getSliceuShortV (StManArrayFile&, const Slicer&, Array<uShort>* dataPtr)
void getSliceIntV (StManArrayFile&, const Slicer&, Array<Int>* dataPtr)
void getSliceuIntV (StManArrayFile&, const Slicer&, Array<uInt>* dataPtr)
void getSlicefloatV (StManArrayFile&, const Slicer&, Array<float>* dataPtr)
void getSlicedoubleV (StManArrayFile&, const Slicer&, Array<double>* dataPtr)
void getSliceComplexV (StManArrayFile&, const Slicer&, Array<Complex>* dataPtr)
void getSliceDComplexV (StManArrayFile&, const Slicer&, Array<DComplex>* dataPtr)
void getSliceStringV (StManArrayFile&, const Slicer&, Array<String>* dataPtr)
void putSliceBoolV (StManArrayFile&, const Slicer&, const Array<Bool>* dataPtr)
void putSliceuCharV (StManArrayFile&, const Slicer&, const Array<uChar>* dataPtr)
void putSliceShortV (StManArrayFile&, const Slicer&, const Array<Short>* dataPtr)
void putSliceuShortV (StManArrayFile&, const Slicer&, const Array<uShort>* dataPtr)
void putSliceIntV (StManArrayFile&, const Slicer&, const Array<Int>* dataPtr)
void putSliceuIntV (StManArrayFile&, const Slicer&, const Array<uInt>* dataPtr)
void putSlicefloatV (StManArrayFile&, const Slicer&, const Array<float>* dataPtr)
void putSlicedoubleV (StManArrayFile&, const Slicer&, const Array<double>* dataPtr)
void putSliceComplexV (StManArrayFile&, const Slicer&, const Array<Complex>* dataPtr)
void putSliceDComplexV (StManArrayFile&, const Slicer&, const Array<DComplex>* dataPtr)
void putSliceStringV (StManArrayFile&, const Slicer&, const Array<String>* dataPtr)
Private Members
void getSliceData (StManArrayFile&, const Slicer& ns, void* value, const value& userArrayShape, void (*getVec) (StManArrayFile&, Int64, uInt, uInt, uInt, uInt, void* dataPtr))
static void getVecBoolV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuCharV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecfloatV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecdoubleV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecDComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecStringV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
void putSliceData (StManArrayFile&, const Slicer& ns, const void* value, const value& userArrayShape, void (*putVec) (StManArrayFile&, Int64, uInt, uInt, uInt, uInt, const void* dataPtr))
static void putVecBoolV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuCharV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecfloatV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecdoubleV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecDComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecStringV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
void checkShape (const IPosition& userArrayShape, const IPosition& tableArrayShape) const

Description

Review Status

Reviewed By:
UNKNOWN
Date Reviewed:
before2004/08/25

Prerequisite

Etymology

StIndArray stores indirect arrays on behalf of a storage manager.

Synopsis

StIndArray is a helper class for accessing indirect table arrays. It is the interface between a storage manager like StManAipsIO (in particular its indirect array column class StManColumnIndArrayAipsIO) and the data storage class StManArrayFile which represents the file holding the shapes and data of the arrays. This file holds the data in canonical format.

StIndArray holds information about an array in the file.

  1. Offset of the array in the file. This points to the array shape. This is stored by storage managers and serves as the mapping between row number and array.
  2. Array data offset, i.e. the length of the shape in the file. Because the data is stored in canonical format, the length of the shape in the file is not directly known but has to be supplied this way.
  3. The actual shape of the array
The storage manager creates an StIndArray object for each row. When an array is accessed for the first time, the array data offset and the shape will be filled in by StIndArray. In this way it serves as a cache for the array shape.

StIndArray implements all necessary functions to get/put an array or an array slice from/into file supplied by the given StManArrayFile object. The StManArrayFile object itself has to be created by the storage manager and given to the StIndArray functions.

Motivation

This helper class makes it possible to share equal functionality between various storage managers handling indirect arrays. At the moment it is used by StmanColumnIndArrayAipsIO and StManColumnIndArrayMirAIO (the AipsIO and Miriad-like storage manager, resp.), but it is not limited to them. It can equally well be used for any other storage manager storing (indirect) arrays via an StManArrayFile object.

Example

Note that the following example is not really useful. StIndArray is an internal class and should not be used by a casual user. The example may however give a bit of insight.
    Array<Float> array(...);
    // Create an StManArrayFile object to hold the arrays.
    StManArrayFile stmanFile ("some.name", ByteIO::New);
    // Create a still empty StIndArray object for an array.
    StIndArray arrayRef(0);
    // Define the shape and allocate a Float array.
    // Put the array data.
    arrayRef.setShape (stmanFile, TpFloat, array.shape());
    arrayRef.putArrayfloatV (stmanFile, &array);
    // Get the file offset of the array (for later use).
    Int64 offset = arrayRef.fileOffset();
    // Create an StIndArray object to read the array back.
    // Of course, the same object could have been used for that purpose,
    // but this shows how to create one for an existing file.
    StIndArray arrayRef2(offset);
    arrayRef2.getShape (stmanFile);             // read shape
    Array<float> array2(arrayRef2.shape());     // create with correct size
    arrayRef2.getArrayfloatV (stmanFile, &array2);
    

To Do

Member Description

StIndArray (Int64 fileOffset)

Construct the object with the given file offset. A zero file offset means that no array has been defined yet. That may be filled in later by setShape.

StIndArray (const StIndArray&)

Copy constructor.

StIndArray& operator= (const StIndArray&)

Assignment.

~StIndArray()

const IPosition& shape() const

Get the shape.

Int64 fileOffset() const

Get the file offset.

Bool setShape (StManArrayFile&, int dataType, const IPosition& shape)

Set the shape and allocate the array in the file. This will define the array and fill in the file offset. If the shape is already defined and does not change, nothing is done and a False value is returned. When the shape changes, the old file space is lost.

void getShape (StManArrayFile& ios)

Read the shape if not read yet.

uInt refCount (StManArrayFile& ios)

Get the reference count.

void incrementRefCount (StManArrayFile& ios)

Increment the reference count.

void decrementRefCount (StManArrayFile& ios)

Decrement the reference count.

void copyData (StManArrayFile& ios, int dataType, const StIndArray& other)

Copy the data from another array. An exception if thrown if the shapes do not match.

void getArrayBoolV (StManArrayFile&, Array<Bool>* dataPtr)
void getArrayuCharV (StManArrayFile&, Array<uChar>* dataPtr)
void getArrayShortV (StManArrayFile&, Array<Short>* dataPtr)
void getArrayuShortV (StManArrayFile&, Array<uShort>* dataPtr)
void getArrayIntV (StManArrayFile&, Array<Int>* dataPtr)
void getArrayuIntV (StManArrayFile&, Array<uInt>* dataPtr)
void getArrayfloatV (StManArrayFile&, Array<float>* dataPtr)
void getArraydoubleV (StManArrayFile&, Array<double>* dataPtr)
void getArrayComplexV (StManArrayFile&, Array<Complex>* dataPtr)
void getArrayDComplexV (StManArrayFile&, Array<DComplex>* dataPtr)
void getArrayStringV (StManArrayFile&, Array<String>* dataPtr)

Get an array value from the file at the offset held in this object. The buffer pointed to by dataPtr has to have the correct length (which is guaranteed by the ArrayColumn get function).

void putArrayBoolV (StManArrayFile&, const Array<Bool>* dataPtr)
void putArrayuCharV (StManArrayFile&, const Array<uChar>* dataPtr)
void putArrayShortV (StManArrayFile&, const Array<Short>* dataPtr)
void putArrayuShortV (StManArrayFile&, const Array<uShort>* dataPtr)
void putArrayIntV (StManArrayFile&, const Array<Int>* dataPtr)
void putArrayuIntV (StManArrayFile&, const Array<uInt>* dataPtr)
void putArrayfloatV (StManArrayFile&, const Array<float>* dataPtr)
void putArraydoubleV (StManArrayFile&, const Array<double>* dataPtr)
void putArrayComplexV (StManArrayFile&, const Array<Complex>* dataPtr)
void putArrayDComplexV (StManArrayFile&, const Array<DComplex>* dataPtr)
void putArrayStringV (StManArrayFile&, const Array<String>* dataPtr)

Put an array value into the file at the offset held in this object. The buffer pointed to by dataPtr has to have the correct length (which is guaranteed by the ArrayColumn put function).

void getSliceBoolV (StManArrayFile&, const Slicer&, Array<Bool>* dataPtr)
void getSliceuCharV (StManArrayFile&, const Slicer&, Array<uChar>* dataPtr)
void getSliceShortV (StManArrayFile&, const Slicer&, Array<Short>* dataPtr)
void getSliceuShortV (StManArrayFile&, const Slicer&, Array<uShort>* dataPtr)
void getSliceIntV (StManArrayFile&, const Slicer&, Array<Int>* dataPtr)
void getSliceuIntV (StManArrayFile&, const Slicer&, Array<uInt>* dataPtr)
void getSlicefloatV (StManArrayFile&, const Slicer&, Array<float>* dataPtr)
void getSlicedoubleV (StManArrayFile&, const Slicer&, Array<double>* dataPtr)
void getSliceComplexV (StManArrayFile&, const Slicer&, Array<Complex>* dataPtr)
void getSliceDComplexV (StManArrayFile&, const Slicer&, Array<DComplex>* dataPtr)
void getSliceStringV (StManArrayFile&, const Slicer&, Array<String>* dataPtr)

Get a section of the array from the file at the offset held in this object. The buffer pointed to by dataPtr has to have the correct length (which is guaranteed by the ArrayColumn getSlice function).

void putSliceBoolV (StManArrayFile&, const Slicer&, const Array<Bool>* dataPtr)
void putSliceuCharV (StManArrayFile&, const Slicer&, const Array<uChar>* dataPtr)
void putSliceShortV (StManArrayFile&, const Slicer&, const Array<Short>* dataPtr)
void putSliceuShortV (StManArrayFile&, const Slicer&, const Array<uShort>* dataPtr)
void putSliceIntV (StManArrayFile&, const Slicer&, const Array<Int>* dataPtr)
void putSliceuIntV (StManArrayFile&, const Slicer&, const Array<uInt>* dataPtr)
void putSlicefloatV (StManArrayFile&, const Slicer&, const Array<float>* dataPtr)
void putSlicedoubleV (StManArrayFile&, const Slicer&, const Array<double>* dataPtr)
void putSliceComplexV (StManArrayFile&, const Slicer&, const Array<Complex>* dataPtr)
void putSliceDComplexV (StManArrayFile&, const Slicer&, const Array<DComplex>* dataPtr)
void putSliceStringV (StManArrayFile&, const Slicer&, const Array<String>* dataPtr)

Put a section of the array into the file at the offset held in this object. The buffer pointed to by dataPtr has to have the correct length (which is guaranteed by the ArrayColumn putSlice function).

void getSliceData (StManArrayFile&, const Slicer& ns, void* value, const value& userArrayShape, void (*getVec) (StManArrayFile&, Int64, uInt, uInt, uInt, uInt, void* dataPtr))

Get sliced data, i.e. get a section of an array. This function is used by getSliceXXXV to have common functionality in one function. It calls the given getVec function for each chunk of data. In this way the bulk of type-independent code is concentrated in getSliceData resulting in small type-dependent functions.

static void getVecBoolV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuCharV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecuIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecfloatV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecdoubleV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecDComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)
static void getVecStringV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, void* value)

Get a (type-dependent) vector part of a slice. This function is called for each chunk by putSliceData.

void putSliceData (StManArrayFile&, const Slicer& ns, const void* value, const value& userArrayShape, void (*putVec) (StManArrayFile&, Int64, uInt, uInt, uInt, uInt, const void* dataPtr))

Put sliced data, i.e. put a section of an array. This function is used by putSlice to have common functionality in one function. It calls the given in putVec function for chunk of data. In this way the bulk of type-independent code is concentrated in putSliceData resulting in small type-dependent functions.

static void putVecBoolV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuCharV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuShortV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecuIntV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecfloatV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecdoubleV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecDComplexV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)
static void putVecStringV (StManArrayFile&, Int64 fileOffset, uInt arrayStart, uInt length, uInt increment, uInt valueIndex, const void* value)

Put a (type-dependent) vector part of a slice. This function is called for each chunk by putSliceData.

void checkShape (const IPosition& userArrayShape, const IPosition& tableArrayShape) const

Throw an exception if the shape of the given array and the table array (slice) are not equal.