LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
PackedIndex.h
Go to the documentation of this file.
1// -*- LSST-C++ -*-
2/*
3 * Developed for the LSST Data Management System.
4 * This product includes software developed by the LSST Project
5 * (https://www.lsst.org).
6 * See the COPYRIGHT file at the top-level directory of this distribution
7 * for details of code ownership.
8 *
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22#ifndef LSST_AFW_MATH_POLYNOMIALS_PackedIndex_h_INCLUDED
23#define LSST_AFW_MATH_POLYNOMIALS_PackedIndex_h_INCLUDED
24
25namespace lsst { namespace geom { namespace polynomials {
26
28enum class PackingOrder {
29
43 YX,
44
58 XY
59};
60
69struct Index2d {
70
72 constexpr Index2d() noexcept : flat(0), nx(0), ny(0) {}
73
75 constexpr Index2d(std::size_t flat_, std::size_t nx_, std::size_t ny_) noexcept :
76 flat(flat_), nx(nx_), ny(ny_)
77 {}
78
80 constexpr bool operator==(Index2d const & other) const noexcept {
81 return flat == other.flat && nx == other.nx && ny == other.ny;
82 }
83
85 constexpr bool operator!=(Index2d const & other) const noexcept {
86 return !(*this == other);
87 }
88
92};
93
94namespace detail {
95
96// Specialization of all PackedIndexIterator/PackedIndexRange logic
97// that isn't common across PackingOrders.
98template <PackingOrder packing> struct PackingOrderTraits;
99
100template <>
102
103 // Return the offset of the given coefficient after the (nx + ny) offset is subtracted off.
105
106 static void increment(Index2d & index) {
107 if (index.ny == 0) {
108 index.ny = index.nx + 1;
109 index.nx = 0;
110 } else {
111 --index.ny;
112 ++index.nx;
113 }
114 }
115
116 // Return the nx and ny values appropriate for the end iterator of a range of the given order.
117 static std::size_t getEndX(std::size_t order) { return 0; }
118 static std::size_t getEndY(std::size_t order) { return order + 1; }
119
120};
121
122template <>
124
125 // Return the offset of the given coefficient after the (nx + ny) offset is subtracted off.
127
128 static void increment(Index2d & index) {
129 if (index.nx == 0) {
130 index.nx = index.ny + 1;
131 index.ny = 0;
132 } else {
133 --index.nx;
134 ++index.ny;
135 }
136 }
137
138 // Return the nx and ny values appropriate for the end iterator of a range of the given order.
139 static std::size_t getEndX(std::size_t order) { return order + 1; }
140 static std::size_t getEndY(std::size_t order) { return 0; }
141
142};
143
144} // namespace detail
145
163template <PackingOrder packing>
166public:
167
170 using pointer = Index2d const *;
171 using reference = Index2d const &;
173
175 static constexpr std::size_t computeOffset(std::size_t order) noexcept {
176 return order*(order + 1)/2;
177 }
178
180 static constexpr std::size_t computeSize(std::size_t order) noexcept {
181 return computeOffset(order + 1);
182 }
183
185 static constexpr std::size_t computeIndex(std::size_t nx, std::size_t ny) noexcept {
186 return computeOffset(nx + ny) + Traits::computeInnerIndex(nx, ny);
187 }
188
190 static constexpr PackedIndexIterator makeEnd(std::size_t order) noexcept {
192 }
193
195 constexpr PackedIndexIterator() noexcept : _index() {}
196
198 constexpr PackedIndexIterator(std::size_t nx, std::size_t ny) noexcept :
199 _index(computeIndex(nx, ny), nx, ny)
200 {}
201
203 constexpr reference operator*() const noexcept { return _index; }
204
206 constexpr pointer operator->() const noexcept { return &_index; }
207
210 ++_index.flat;
211 Traits::increment(_index);
212 return *this;
213 }
214
217 PackedIndexIterator r(*this);
218 ++(*this);
219 return r;
220 }
221
223 constexpr bool operator==(PackedIndexIterator const & other) const noexcept {
224 return _index == other._index;
225 }
226
228 constexpr bool operator!=(PackedIndexIterator const & other) const noexcept {
229 return !(*this == other);
230 }
231
232private:
233
234 constexpr PackedIndexIterator(std::size_t order) noexcept :
235 _index(computeOffset(order + 1), Traits::getEndX(order), Traits::getEndY(order))
236 {}
237
238 Index2d _index;
239};
240
247template <PackingOrder packing>
249public:
250
255 using pointer = typename iterator::pointer;
258
260 static constexpr std::size_t computeOffset(std::size_t order) noexcept {
262 }
263
265 static constexpr std::size_t computeSize(std::size_t order) noexcept {
267 }
268
270 static constexpr std::size_t computeIndex(std::size_t nx, std::size_t ny) noexcept {
271 return iterator::computeIndex(nx, ny);
272 }
273
275 constexpr PackedIndexRange(iterator first, iterator last) noexcept :
276 _begin(first),
277 _end(last)
278 {}
279
281 constexpr iterator begin() const noexcept { return _begin; }
282
284 constexpr iterator cbegin() const noexcept { return _begin; }
285
287 constexpr iterator end() const noexcept { return _end; }
288
290 constexpr iterator cend() const noexcept { return _end; }
291
293 constexpr std::size_t size() const noexcept { return _end->flat - _begin->flat; }
294
296 constexpr bool empty() const noexcept { return size() == 0u; }
297
299 constexpr bool operator==(PackedIndexRange const & other) const noexcept {
300 return _begin == other._begin && _end == other._end;
301 }
302
304 constexpr bool operator!=(PackedIndexRange const & other) const noexcept {
305 return !(*this == other);
306 }
307
308private:
309 iterator _begin;
310 iterator _end;
311};
312
313}}} // namespace lsst::geom::polynomials
314
315#endif // !LSST_AFW_MATH_POLYNOMIALS_PackedIndex_h_INCLUDED
An iterator for traversing "packed" triangular 2-d series expansions, in which two 1-d expansions are...
Definition: PackedIndex.h:164
PackedIndexIterator operator++(int) noexcept
Move to the next element in the packed array and return a copy of the iterator before the move.
Definition: PackedIndex.h:216
constexpr pointer operator->() const noexcept
Dereference the iterator, yielding a Index2d const pointer.
Definition: PackedIndex.h:206
constexpr bool operator!=(PackedIndexIterator const &other) const noexcept
Inequality comparison.
Definition: PackedIndex.h:228
constexpr PackedIndexIterator(std::size_t nx, std::size_t ny) noexcept
Construct an iterator pointing to the element with the given x and y orders.
Definition: PackedIndex.h:198
static constexpr std::size_t computeIndex(std::size_t nx, std::size_t ny) noexcept
Return the flattened index for the element with the given x and y orders.
Definition: PackedIndex.h:185
constexpr bool operator==(PackedIndexIterator const &other) const noexcept
Equality comparison.
Definition: PackedIndex.h:223
PackedIndexIterator & operator++() noexcept
Move to the next element in the packed array and return the iterator.
Definition: PackedIndex.h:209
static constexpr PackedIndexIterator makeEnd(std::size_t order) noexcept
Construct an iterator one past the end of an expansion with the given order.
Definition: PackedIndex.h:190
static constexpr std::size_t computeSize(std::size_t order) noexcept
Return the flattened size of an expansion with the given maximum order (inclusive).
Definition: PackedIndex.h:180
constexpr PackedIndexIterator() noexcept
Construct an iterator at the beginning of an expansion of any order.
Definition: PackedIndex.h:195
static constexpr std::size_t computeOffset(std::size_t order) noexcept
Return the flattened offset to the start of the given order.
Definition: PackedIndex.h:175
constexpr reference operator*() const noexcept
Dereference the iterator, yielding a Index2d const reference.
Definition: PackedIndex.h:203
A specialized iterator range class for PackedIndexIterator, providing size calculation,...
Definition: PackedIndex.h:248
constexpr bool empty() const noexcept
Return true if the number of elements in the flattened expansion is zero.
Definition: PackedIndex.h:296
constexpr iterator begin() const noexcept
Return an iterator to the start of the range.
Definition: PackedIndex.h:281
PackedIndexIterator< packing > iterator
Definition: PackedIndex.h:251
typename iterator::reference reference
Definition: PackedIndex.h:254
constexpr PackedIndexRange(iterator first, iterator last) noexcept
Construct from begin and end iterators.
Definition: PackedIndex.h:275
typename iterator::difference_type difference_type
Definition: PackedIndex.h:256
constexpr bool operator==(PackedIndexRange const &other) const noexcept
Equality comparison.
Definition: PackedIndex.h:299
constexpr bool operator!=(PackedIndexRange const &other) const noexcept
Inequality comparison.
Definition: PackedIndex.h:304
typename iterator::pointer pointer
Definition: PackedIndex.h:255
constexpr iterator cbegin() const noexcept
Return an iterator to the start of the range.
Definition: PackedIndex.h:284
static constexpr std::size_t computeSize(std::size_t order) noexcept
Return the flattened size of an expansion with the given maximum order (inclusive).
Definition: PackedIndex.h:265
constexpr iterator end() const noexcept
Return an iterator to one past the end of the range.
Definition: PackedIndex.h:287
typename iterator::value_type value_type
Definition: PackedIndex.h:253
static constexpr std::size_t computeIndex(std::size_t nx, std::size_t ny) noexcept
Return the flattened index for the element with the given x and y orders.
Definition: PackedIndex.h:270
constexpr iterator cend() const noexcept
Return an iterator to one past the end of the range.
Definition: PackedIndex.h:290
constexpr std::size_t size() const noexcept
Return the number of elements in the flattened expansion.
Definition: PackedIndex.h:293
static constexpr std::size_t computeOffset(std::size_t order) noexcept
Return the flattened offset to the start of the given order.
Definition: PackedIndex.h:260
PackingOrder
Enum defining the packing orders used to order 2-d polynomial coefficients.
Definition: PackedIndex.h:28
@ XY
A pair of indices is mapped to the flattened position , which yields the (nx, ny) ordering.
@ YX
A pair of indices is mapped to the flattened position , which yields the (nx, ny) ordering.
A base class for image defects.
A custom tuple that relates the indices of two 1-d functions for x and y to the flattened index for t...
Definition: PackedIndex.h:69
constexpr bool operator==(Index2d const &other) const noexcept
Equality comparison.
Definition: PackedIndex.h:80
std::size_t nx
Index into the 1-d function for nx.
Definition: PackedIndex.h:90
constexpr bool operator!=(Index2d const &other) const noexcept
Inequality comparison.
Definition: PackedIndex.h:85
std::size_t ny
Index into the 1-d functoin for ny.
Definition: PackedIndex.h:91
std::size_t flat
Index into the flattened 2-d function.
Definition: PackedIndex.h:89
constexpr Index2d(std::size_t flat_, std::size_t nx_, std::size_t ny_) noexcept
Construct with the provided values.
Definition: PackedIndex.h:75
constexpr Index2d() noexcept
Construct an index with zero entries.
Definition: PackedIndex.h:72
static std::size_t computeInnerIndex(std::size_t nx, std::size_t ny)
Definition: PackedIndex.h:126
static std::size_t computeInnerIndex(std::size_t nx, std::size_t ny)
Definition: PackedIndex.h:104
table::Key< int > order