//# 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: //
    //
  1. axesAreCursor=true means that the axes form the cursor axes. // The remaining axes will form the iteration axes. // This is the default. //
  2. 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