casacore
ArrayIter.h
Go to the documentation of this file.
1//# ArrayIter.h: Iterate an Array cursor through another Array.
2//# Copyright (C) 1993,1994,1995,1996,1999
3//# Associated Universities, Inc. Washington DC, USA.
4//#
5//# This library is free software; you can redistribute it and/or modify it
6//# under the terms of the GNU Library General Public License as published by
7//# the Free Software Foundation; either version 2 of the License, or (at your
8//# option) any later version.
9//#
10//# This library is distributed in the hope that it will be useful, but WITHOUT
11//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13//# License for more details.
14//#
15//# You should have received a copy of the GNU Library General Public License
16//# along with this library; if not, write to the Free Software Foundation,
17//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18//#
19//# Correspondence concerning AIPS++ should be addressed as follows:
20//# Internet email: aips2-request@nrao.edu.
21//# Postal address: AIPS++ Project Office
22//# National Radio Astronomy Observatory
23//# 520 Edgemont Road
24//# Charlottesville, VA 22903-2475 USA
25//#
26//# $Id$
27
28#ifndef CASA_ARRAYITER2_H
29#define CASA_ARRAYITER2_H
30
31#include "ArrayPosIter.h"
32#include "Array.h"
33
34
35namespace casacore { //# NAMESPACE CASACORE - BEGIN
36
37//
38// <summary> Iterate an Array cursor through another Array. </summary>
39// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="" demos="">
40// </reviewed>
41//
42// ArrayIterator steps an array section (the "cursor") through an array.
43// The cursor "refers" to storage in the array, so that changing the
44// values in the cursor changes values in the original array. Like with
45// ArrayPositionIterator, the cursor presently only moves through the array from
46// bottom to top in the obvious way; however one may of course iterate
47// through a slice ("array section"). This class is derived from
48// ArrayPositionIterator since it also has a position (the blc of the cursor)
49// which moves through the array volume.
50//
51// <note role=tip> The origin of the cursor, i.e. the subarray that moves
52// through the larger array, is always zero.
53// </note>
54//
55// <srcblock>
56// Array<float> to, from;
57// //... set to and from, check that they are conformant
58// ArrayIterator toiter(to,1);
59// ArrayIterator fromiter(from,1);
60// while (! toiter.pastEnd() ) {
61// toiter.array() = fromiter.array(); // copy vector by vector
62// toiter.next(); fromiter.next();
63// }
64//
65// </srcblock>
66//
67// <linkfrom anchor=ArrayIterator classes="Array Vector Matrix Cube">
68// <here>ArrayIterator</here> -- Iterate an Array cursor through another Array.
69// </linkfrom>
70//
71template<typename T, typename Alloc> class ArrayIterator : public ArrayPositionIterator
72{
73public:
74 // Step through array "arr" over the first byDim axes
75 // (using a cursor of dimensionality "byDim").
76 explicit ArrayIterator(const Array<T, Alloc> &arr, size_t byDim=1);
77
78 // Step through an array using the given axes.
79 // The axes can be given in two ways:
80 // <ol>
81 // <li>axesAreCursor=true means that the axes form the cursor axes.
82 // The remaining axes will form the iteration axes.
83 // This is the default.
84 // <li>axesAreCursor=false means the opposite.
85 // In this case the iteration axes can be given in any order.
86 // </ol>
87 // E.g. when using iteration axes 2,0 for an array with shape [5,3,7], each
88 // iteration step returns a cursor (containing the data of axis 1).
89 // During the iteration axis 2 will vary most rapidly (as it was
90 // given first).
91 ArrayIterator(const Array<T, Alloc> &arr, const IPosition &axes,
92 bool axesAreCursor = true);
93
94 // Move the cursor to the next position.
95 virtual void next() override;
96
97 // Set the cursor to the given position.
98 // The position can only contain the iteration axes or it can be the full
99 // position.
100 // <br>In the first case the position must to be given in the order
101 // of the iteration axes as given in the constructor.
102 // In the latter case the position must be given in natural order
103 // (as given by function <src>pos</src> and only the cursor axes are taken
104 // into account.
105 virtual void set (const IPosition& cursorPos) override;
106
107 // Reset the cursor to the beginning.
108 // <group>
109 virtual void reset() override;
110 // </group>
111
112 // Return the cursor. (Perhaps we should have a fn() that returns a
113 // reference to the original array as well?)
114 // <group>
116 virtual ArrayBase& getArray() override;
117 // </group>
118
119
120protected:
121 // The cursor
122 std::unique_ptr<Array<T, Alloc>> ap_p;
123
124private:
125 // helper function to centralize construction work
126 void init(const Array<T, Alloc> &);
127 // helper function to set the pointer to the new data position in ap
128 // after a step in the given dimension. -1 resets it to the beginning.
129 void apSetPointer(int stepDim);
130
134
135 //# Presently the following are not defined.
138};
139
140//
141// <summary> Iterate a const Array cursor through a const Array. </summary>
142// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="" demos="">
143// </reviewed>
144//
145// This class behaves exactly like an ArrayIterator, only it iterates through
146// const Arrays.
147//
148// <srcblock>
149// void CopyArray(Array<float> &to, const Array<float> &from)
150// {
151// //... check that they are conformant
152// ArrayIterator toiter(to,1);
153// ReadOnlyArrayIterator fromiter(from,1);
154// while (! toiter.pastEnd() ) {
155// toiter.array() = fromiter.array(); // copy vector by vector
156// toiter.next(); fromiter.next();
157// }
158// }
159// </srcblock>
160// <note role=tip> This class is not derived from ArrayPositionIterator. For simplicity
161// it merely contains an ArrayIterator to which it forwards requests
162// and returns (const) results. The iterator classes should be
163// rethought and reimplemented.
164// </note>
165//
166// <linkfrom anchor=ReadOnlyArrayIterator classes="Array Vector Matrix Cube">
167// <here>ReadOnlyArrayIterator</here> -- Iterate a const Array cursor through
168// a const Array.
169// </linkfrom>
170//
171template<typename T, typename Alloc=std::allocator<T>> class ReadOnlyArrayIterator
172{
173public:
174 // Step through array "arr" using a cursor of dimensionality "byDim".
175 explicit ReadOnlyArrayIterator(const Array<T, Alloc> &arr, size_t byDim=1)
176 : ai(const_cast<Array<T, Alloc>&>(arr),byDim) {}
177
178 // Step through an array for the given iteration axes.
180 bool axesAreCursor = true)
181 : ai(const_cast<Array<T, Alloc>&>(arr),axes,axesAreCursor) {}
182
183 // Move the cursor to the next position.
184 void next() {ai.next();}
185
186 // Set the cursor to the given position.
187 // The position can only contain the iteration axes or it can be the full
188 // position.
189 // <br>In the first case the position must to be given in the order
190 // of the iteration axes as given in the constructor.
191 // In the latter case the position must be given in natural order
192 // (as given by function <src>pos</src> and only the cursor axes are taken
193 // into account.
194 void set (const IPosition& cursorPos) {ai.set(cursorPos);}
195
196 // Reset the cursor to the beginning.
197 // <group>
198 void reset() {ai.origin();}
199 void origin() {ai.origin();}
200 // </group>
201
202 // Return the cursor. (Perhaps we should have a fn() that returns a
203 // reference to the original array as well?)
204 const Array<T, Alloc> &array() {return ai.array();}
205
206 // The same as the functions in ArrayPositionIterator.
207 // <group>
208 bool atStart() const {return ai.atStart();}
209 bool pastEnd() const {return ai.pastEnd();}
210 const IPosition &pos() const {return ai.pos();}
211 IPosition endPos() const {return ai.endPos();}
212 size_t ndim() const {return ai.ndim();}
213 // </group>
214private:
215 // Not implemented.
216 // <group>
219 // </group>
220
222};
223
224
225
226} //# NAMESPACE CASACORE - END
227
228#include "ArrayIter.tcc"
229
230#endif
Non-templated base class for templated Array class.
Definition: ArrayBase.h:73
ArrayIterator(const Array< T, Alloc > &arr, size_t byDim=1)
Step through array "arr" over the first byDim axes (using a cursor of dimensionality "byDim").
virtual ArrayBase & getArray() override
Get the array in the cursor.
Array< T, Alloc > pOriginalArray_p
Definition: ArrayIter.h:131
void apSetPointer(int stepDim)
helper function to set the pointer to the new data position in ap after a step in the given dimension...
Array< T, Alloc > & array()
Return the cursor.
Definition: ArrayIter.h:115
virtual void set(const IPosition &cursorPos) override
Set the cursor to the given position.
void init(const Array< T, Alloc > &)
helper function to centralize construction work
ArrayIterator< T, Alloc > & operator=(const ArrayIterator< T, Alloc > &)
virtual void reset() override
Reset the cursor to the beginning.
std::unique_ptr< Array< T, Alloc > > ap_p
The cursor.
Definition: ArrayIter.h:122
ArrayIterator(const Array< T, Alloc > &arr, const IPosition &axes, bool axesAreCursor=true)
Step through an array using the given axes.
virtual void next() override
Move the cursor to the next position.
ArrayIterator(const ArrayIterator< T, Alloc > &)
Iterate a const Array cursor through a const Array.
Definition: ArrayIter.h:172
const IPosition & pos() const
Definition: ArrayIter.h:210
void reset()
Reset the cursor to the beginning.
Definition: ArrayIter.h:198
void next()
Move the cursor to the next position.
Definition: ArrayIter.h:184
void set(const IPosition &cursorPos)
Set the cursor to the given position.
Definition: ArrayIter.h:194
bool atStart() const
The same as the functions in ArrayPositionIterator.
Definition: ArrayIter.h:208
IPosition endPos() const
Definition: ArrayIter.h:211
ReadOnlyArrayIterator(const Array< T, Alloc > &arr, const IPosition &axes, bool axesAreCursor=true)
Step through an array for the given iteration axes.
Definition: ArrayIter.h:179
ReadOnlyArrayIterator< T, Alloc > & operator=(const ReadOnlyArrayIterator< T, Alloc > &)
ReadOnlyArrayIterator(const ReadOnlyArrayIterator< T, Alloc > &)
Not implemented.
const Array< T, Alloc > & array()
Return the cursor.
Definition: ArrayIter.h:204
ReadOnlyArrayIterator(const Array< T, Alloc > &arr, size_t byDim=1)
Step through array "arr" using a cursor of dimensionality "byDim".
Definition: ArrayIter.h:175
ArrayIterator< T, Alloc > ai
Definition: ArrayIter.h:221
this file contains all the compiler specific defines
Definition: mainpage.dox:28