//# ArrayIter.h: Iterate an Array cursor through another Array.
//# Copyright (C) 1993,1994,1995,1996,1999
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: aips2-request@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
//#
//# $Id$
#ifndef CASA_ARRAYITER2_H
#define CASA_ARRAYITER2_H
#include "ArrayPosIter.h"
#include "Array.h"
namespace casacore { //# NAMESPACE CASACORE - BEGIN
//
// Iterate an Array cursor through another Array.
//
//
//
// ArrayIterator steps an array section (the "cursor") through an array.
// The cursor "refers" to storage in the array, so that changing the
// values in the cursor changes values in the original array. Like with
// ArrayPositionIterator, the cursor presently only moves through the array from
// bottom to top in the obvious way; however one may of course iterate
// through a slice ("array section"). This class is derived from
// ArrayPositionIterator since it also has a position (the blc of the cursor)
// which moves through the array volume.
//
// The origin of the cursor, i.e. the subarray that moves
// through the larger array, is always zero.
//
//
//
// Array to, from;
// //... set to and from, check that they are conformant
// ArrayIterator toiter(to,1);
// ArrayIterator fromiter(from,1);
// while (! toiter.pastEnd() ) {
// toiter.array() = fromiter.array(); // copy vector by vector
// toiter.next(); fromiter.next();
// }
//
//
//
//
// ArrayIterator -- Iterate an Array cursor through another Array.
//
//
template class ArrayIterator : public ArrayPositionIterator
{
public:
// Step through array "arr" over the first byDim axes
// (using a cursor of dimensionality "byDim").
explicit ArrayIterator(const Array &arr, size_t byDim=1);
// Step through an array using the given axes.
// The axes can be given in two ways:
//
// - axesAreCursor=true means that the axes form the cursor axes.
// The remaining axes will form the iteration axes.
// This is the default.
//
- axesAreCursor=false means the opposite.
// In this case the iteration axes can be given in any order.
//
// E.g. when using iteration axes 2,0 for an array with shape [5,3,7], each
// iteration step returns a cursor (containing the data of axis 1).
// During the iteration axis 2 will vary most rapidly (as it was
// given first).
ArrayIterator(const Array &arr, const IPosition &axes,
bool axesAreCursor = true);
// Move the cursor to the next position.
virtual void next() override;
// Set the cursor to the given position.
// The position can only contain the iteration axes or it can be the full
// position.
//
In the first case the position must to be given in the order
// of the iteration axes as given in the constructor.
// In the latter case the position must be given in natural order
// (as given by function pos and only the cursor axes are taken
// into account.
virtual void set (const IPosition& cursorPos) override;
// Reset the cursor to the beginning.
//
virtual void reset() override;
//
// Return the cursor. (Perhaps we should have a fn() that returns a
// reference to the original array as well?)
//
Array &array() {return *ap_p;}
virtual ArrayBase& getArray() override;
//
protected:
// The cursor
std::unique_ptr> ap_p;
private:
// helper function to centralize construction work
void init(const Array &);
// helper function to set the pointer to the new data position in ap
// after a step in the given dimension. -1 resets it to the beginning.
void apSetPointer(int stepDim);
Array pOriginalArray_p;
IPosition offset_p;
T* dataPtr_p;
//# Presently the following are not defined.
ArrayIterator(const ArrayIterator &);
ArrayIterator &operator=(const ArrayIterator &);
};
//
// Iterate a const Array cursor through a const Array.
//
//
//
// This class behaves exactly like an ArrayIterator, only it iterates through
// const Arrays.
//
//
// void CopyArray(Array &to, const Array &from)
// {
// //... check that they are conformant
// ArrayIterator toiter(to,1);
// ReadOnlyArrayIterator fromiter(from,1);
// while (! toiter.pastEnd() ) {
// toiter.array() = fromiter.array(); // copy vector by vector
// toiter.next(); fromiter.next();
// }
// }
//
// This class is not derived from ArrayPositionIterator. For simplicity
// it merely contains an ArrayIterator to which it forwards requests
// and returns (const) results. The iterator classes should be
// rethought and reimplemented.
//
//
//
// ReadOnlyArrayIterator -- Iterate a const Array cursor through
// a const Array.
//
//
template> class ReadOnlyArrayIterator
{
public:
// Step through array "arr" using a cursor of dimensionality "byDim".
explicit ReadOnlyArrayIterator(const Array &arr, size_t byDim=1)
: ai(const_cast&>(arr),byDim) {}
// Step through an array for the given iteration axes.
ReadOnlyArrayIterator(const Array &arr, const IPosition &axes,
bool axesAreCursor = true)
: ai(const_cast&>(arr),axes,axesAreCursor) {}
// Move the cursor to the next position.
void next() {ai.next();}
// Set the cursor to the given position.
// The position can only contain the iteration axes or it can be the full
// position.
//
In the first case the position must to be given in the order
// of the iteration axes as given in the constructor.
// In the latter case the position must be given in natural order
// (as given by function pos and only the cursor axes are taken
// into account.
void set (const IPosition& cursorPos) {ai.set(cursorPos);}
// Reset the cursor to the beginning.
//
void reset() {ai.origin();}
void origin() {ai.origin();}
//
// Return the cursor. (Perhaps we should have a fn() that returns a
// reference to the original array as well?)
const Array &array() {return ai.array();}
// The same as the functions in ArrayPositionIterator.
//
bool atStart() const {return ai.atStart();}
bool pastEnd() const {return ai.pastEnd();}
const IPosition &pos() const {return ai.pos();}
IPosition endPos() const {return ai.endPos();}
size_t ndim() const {return ai.ndim();}
//
private:
// Not implemented.
//
ReadOnlyArrayIterator (const ReadOnlyArrayIterator &);
ReadOnlyArrayIterator &operator=(const ReadOnlyArrayIterator &);
//
ArrayIterator ai;
};
} //# NAMESPACE CASACORE - END
#include "ArrayIter.tcc"
#endif