STIR 6.4.0
FullArrayIterator.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2000 PARAPET partners
5 Copyright (C) 2000- 2005, Hammersmith Imanet Ltd
6 This file is part of STIR.
7
8 SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
9
10 See STIR/LICENSE.txt for details
11*/
12
25
26START_NAMESPACE_STIR
27
28template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
29FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::FullArrayIterator()
30 : current_top_level_iter(0),
31 last_top_level_iter(0),
32 current_rest_iter(),
33 last_rest_iter()
34{}
35
36template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
37FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::FullArrayIterator(
38 unsigned
39#ifndef NDEBUG
40 param // only give the parameter a name in debug mode to avoid compiler warning
41#endif
42 )
43 : current_top_level_iter(0),
44 last_top_level_iter(0),
45 current_rest_iter(0),
46 last_rest_iter(0)
47{
48 assert(param == 0);
49}
50
51template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
52FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::FullArrayIterator(const topleveliterT& top_level_iter,
53 const topleveliterT& last_top_level_iter,
54 const restiterT& rest_iter,
55 const restiterT& last_rest_iter)
56 : current_top_level_iter(top_level_iter),
57 last_top_level_iter(last_top_level_iter),
58 current_rest_iter(rest_iter),
59 last_rest_iter(last_rest_iter)
60{}
61
62template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
63FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::FullArrayIterator(
65 : current_top_level_iter(iter2.current_top_level_iter),
66 last_top_level_iter(iter2.last_top_level_iter),
67 current_rest_iter(iter2.current_rest_iter),
68 last_rest_iter(iter2.last_rest_iter)
69{}
70
71template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
72bool
74 const FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>& iter2) const
75{
76 return current_top_level_iter == iter2.current_top_level_iter && current_rest_iter == iter2.current_rest_iter;
77
78 /* alternative:
79 comparing rest_iter is only necessary when the first iterator is not
80 at the end. However, this is the most common case, so the
81 implementation above is faster as it has one test less.
82 However, the above relies on the fact that incrementing the iterator
83 ends up exactly in end_all().
84
85 current_top_level_iter == iter2.current_top_level_iter &&
86 ( current_top_level_iter != last_top_level_iterator &&
87 current_rest_iter == iter2.current_rest_iter);
88 */
89}
90template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
91bool
92FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::operator!=(
94{
95 return !(*this == iter2);
96}
97
98template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
99typename FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::reference
105template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
106typename FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>::pointer
108{
109 return &(operator*());
111
114 This <b>has to</b> represent \c end_all() of this full_iterator.
115*/
116template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
117FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr>&
119{
120 assert(current_top_level_iter < last_top_level_iter);
121 ++current_rest_iter;
122 if (current_rest_iter == last_rest_iter)
123 {
124 ++current_top_level_iter;
125 if (current_top_level_iter != (last_top_level_iter))
126 {
127 current_rest_iter = (*current_top_level_iter).begin_all();
128 last_rest_iter = (*current_top_level_iter).end_all();
129 }
130 else
131 {
132 current_rest_iter = restiterT(0);
133 last_rest_iter = restiterT(0);
134 }
135 }
136 return *this;
137}
138
139template <class topleveliterT, class restiterT, class elemT, class _Ref, class _Ptr>
142{
143 FullArrayIterator<topleveliterT, restiterT, elemT, _Ref, _Ptr> was = *this;
144 ++(*this);
145 return was;
146}
147
148END_NAMESPACE_STIR
Class FullArrayIterator implements (forward) iterators that go through all elements of an Array.
Definition FullArrayIterator.h:49
bool operator==(const FullArrayIterator &) const
comparison operator
Definition FullArrayIterator.inl:73
reference operator*() const
dereferencing operator
Definition FullArrayIterator.inl:100
pointer operator->() const
member-selection operator
Definition FullArrayIterator.inl:107
FullArrayIterator & operator++()
prefix increment
Definition FullArrayIterator.inl:118