ArraySampledFunctional.h

Classes

ArraySampledFunctional -- Index into an array using the longest axis (full description)

template<class T> class ArraySampledFunctional :public SampledFunctional<T>

Interface

Public Members
ArraySampledFunctional()
ArraySampledFunctional(const T & data)
ArraySampledFunctional(ArraySampledFunctional<T> & other)
ArraySampledFunctional<T> & operator=(ArraySampledFunctional<T> &other)
virtual T operator()(const uInt & index) const
virtual uInt nelements() const
virtual ~ArraySampledFunctional()
const T operator()(const uInt & index)

Description

Review Status

Reviewed By:
wyoung
Date Reviewed:
1996/10/19
Programs:
Tests:

Prerequisite

Etymology

A SampledFunctional is an interface that allows random access to a fixed size data set. An ArraySampledFunctional allows you to access slices of an an Array object.

Synopsis

An ArraySampledFunctional allows an Array object to be sliced up with each sample being one slice of the original Array. The slices are always the same size and the indexing is always done along the last non-degenerate dimension. For example a(4,3,20,1) is interpreted as a SampledFunctional with 20 elements, each one being a 4 by 3 matrix.

The Array that is passed to the constructor is copied by this class but because Arrays themselves use reference symantics, the actual data is not copied but referenced. This means that modifying the data in the original array will correspondingly modify the data accessed by this class.

Similarly the Array that is returned for each Slice is a reference to the actual data so that modifying this array really modifies the original data. This is not recommended as the operator() function is not supposed to be used to get a modifiable portion of the data.

Example

Constructing and using ArraySampledFunctionals
    Array<Float> a(IPosition(4,4,3,20,1)); // Create an array
    ... Fill the array any way you like ... 
    ArraySampledFunctional<Array<Float> >fa(a);
    for(uInt i = 0; i < 20; i++)
     cout << "f(" << i << ") = " << fa(i) << endl;
    // Each 'slice' is a 4 by 3 Matrix
    

Motivation

I needed a SampledFunctional which could return Arrays of arbitrary (but fixed) size for each index. This could be done using a ScalarSampledFunctional<Array<T> > but is ineffecient as each element is stored as a separate Array. This class is a more efficient way to solve this problem.

Template Type Argument Requirements (T)

Thrown Exceptions

To Do

Member Description

ArraySampledFunctional()
ArraySampledFunctional(const T & data)

These constructors copy the array that is passed to them. But because arrays use reference symantics the data is not copied. The default constructor is basically useless, as there is no way to add the data once the class has been constructed.

ArraySampledFunctional(ArraySampledFunctional<T> & other)
ArraySampledFunctional<T> & operator=(ArraySampledFunctional<T> &other)

The standard copy constructor and assignment operator

virtual T operator()(const uInt & index) const
virtual uInt nelements() const
virtual ~ArraySampledFunctional()

Define the functions for the SampledFunction interface

const T operator()(const uInt & index)

An alternate version of the sampling function which is more effecient because it does not need to create as many temporary objects or copy the Array data.