1 #ifndef Toolkit_Iterators_hpp 2 #define Toolkit_Iterators_hpp 4 #include <stk_mesh/base/Bucket.hpp> 5 #include <stk_mesh/base/Selector.hpp> 7 #include <boost/iterator/filter_iterator.hpp> 22 template<
typename HighLevelItrType,
typename LowLevelItrType>
23 class TwoLevelIterator :
public std::iterator<std::forward_iterator_tag, typename LowLevelItrType::value_type>
26 typedef TwoLevelIterator<HighLevelItrType, LowLevelItrType>
self;
29 TwoLevelIterator(HighLevelItrType high_itr, LowLevelItrType low_itr, HighLevelItrType high_end_itr) :
32 m_high_end_itr(high_end_itr)
34 if (high_itr != high_end_itr) {
35 find_next_valid_item();
40 TwoLevelIterator(HighLevelItrType high_end_itr) :
41 m_high_itr(high_end_itr),
43 m_high_end_itr(high_end_itr)
52 bool operator==(
const self& rhs)
const 54 return (m_high_itr == rhs.m_high_itr && m_low_itr == rhs.m_low_itr);
57 bool operator!=(
const self& rhs)
const 59 return !(*
this == rhs);
77 typename LowLevelItrType::reference operator*()
const 82 typename LowLevelItrType::pointer operator->()
const 88 void find_next_valid_item()
91 while (m_low_itr == get_end(*m_high_itr)) {
93 if (m_high_itr == m_high_end_itr) {
95 m_low_itr = LowLevelItrType();
98 m_low_itr = get_begin(*m_high_itr);
105 template <
typename Cont>
107 get_begin(Cont& container)
109 return LowLevelItrType(container.begin());
112 template <
typename Cont>
114 get_end(Cont& container)
116 return LowLevelItrType(container.end());
119 template <
class Cont>
121 get_begin(Cont* container_ptr)
123 return LowLevelItrType(container_ptr->begin());
126 template <
class Cont>
128 get_end(Cont* container_ptr)
130 return LowLevelItrType(container_ptr->end());
136 find_next_valid_item();
139 HighLevelItrType m_high_itr;
140 LowLevelItrType m_low_itr;
141 HighLevelItrType m_high_end_itr;
153 template <
typename BucketIteratorType>
154 class SelectedBucketIterator :
public std::iterator<std::forward_iterator_tag,
155 typename BucketIteratorType::value_type,
156 typename BucketIteratorType::difference_type,
157 typename BucketIteratorType::pointer,
158 typename BucketIteratorType::value_type>
161 typedef SelectedBucketIterator<BucketIteratorType>
self;
163 SelectedBucketIterator(
const Selector& selector, BucketIteratorType bucket_itr, BucketIteratorType bucket_end_itr) :
164 m_bucket_itr(bucket_itr),
165 m_bucket_end_itr(bucket_end_itr),
168 if (bucket_itr != bucket_end_itr) {
169 find_next_valid_item();
174 SelectedBucketIterator(BucketIteratorType bucket_end_itr) :
175 m_bucket_itr(bucket_end_itr),
176 m_bucket_end_itr(bucket_end_itr),
180 SelectedBucketIterator() :
186 SelectedBucketIterator(
const self& rhs) :
187 m_bucket_itr(rhs.m_bucket_itr),
188 m_bucket_end_itr(rhs.m_bucket_end_itr),
189 m_selector(rhs.m_selector)
192 self& operator=(
const self& rhs)
194 m_bucket_itr = rhs.m_bucket_itr;
195 m_bucket_end_itr = rhs.m_bucket_end_itr;
196 m_selector = rhs.m_selector;
201 bool operator==(
const self& rhs)
const 203 return (m_bucket_itr == rhs.m_bucket_itr);
206 bool operator==(
const BucketIteratorType& rhs)
const 208 return (m_bucket_itr == rhs);
211 bool operator!=(
const self& rhs)
const 213 return !(*
this == rhs);
234 typename BucketIteratorType::value_type operator*()
const 236 return *m_bucket_itr;
239 typename BucketIteratorType::pointer operator->()
const 241 return &*m_bucket_itr;
245 void find_next_valid_item()
247 while (m_bucket_itr != m_bucket_end_itr && !m_selector(**m_bucket_itr)) {
255 find_next_valid_item();
258 BucketIteratorType m_bucket_itr;
259 BucketIteratorType m_bucket_end_itr;
264 typedef TwoLevelIterator<std::vector<Bucket*>::const_iterator, BucketPtrIterator> BucketVectorEntityIterator;
265 typedef std::pair<BucketVectorEntityIterator, BucketVectorEntityIterator> BucketVectorEntityIteratorRange;
268 typedef SelectedBucketIterator<std::vector<Bucket*>::const_iterator> SelectedBucketVectorIterator;
270 typedef std::pair<SelectedBucketVectorIterator, SelectedBucketVectorIterator> SelectedBucketVectorIteratorRange;
273 typedef TwoLevelIterator<SelectedBucketVectorIterator, BucketPtrIterator> SelectedBucketVectorEntityIterator;
274 typedef std::pair<SelectedBucketVectorEntityIterator, SelectedBucketVectorEntityIterator> SelectedBucketVectorEntityIteratorRange;
277 typedef TwoLevelIterator<std::vector<std::vector<Bucket*> >::const_iterator, std::vector<Bucket*>::const_iterator> AllBucketsIterator;
278 typedef std::pair<AllBucketsIterator, AllBucketsIterator> AllBucketsRange;
281 typedef SelectedBucketIterator<AllBucketsIterator> AllSelectedBucketsIterator;
283 typedef std::pair<AllSelectedBucketsIterator, AllSelectedBucketsIterator> AllSelectedBucketsRange;
286 typedef TwoLevelIterator<AllBucketsIterator, BucketPtrIterator> BucketRangeEntityIterator;
287 typedef std::pair<BucketRangeEntityIterator, BucketRangeEntityIterator> BucketRangeEntityIteratorRange;
290 typedef TwoLevelIterator<AllSelectedBucketsIterator, BucketPtrIterator> SelectedBucketRangeEntityIterator;
291 typedef std::pair<SelectedBucketRangeEntityIterator, SelectedBucketRangeEntityIterator> SelectedBucketRangeEntityIteratorRange;
299 BucketVectorEntityIteratorRange get_entity_range(
const std::vector<Bucket*>& buckets);
302 SelectedBucketVectorEntityIteratorRange get_entity_range(
const std::vector<Bucket*>& buckets,
const Selector& selector);
305 AllBucketsRange get_bucket_range(
const std::vector<std::vector<Bucket*> >& buckets);
309 AllBucketsRange get_bucket_range(
const std::vector<std::vector<Bucket*> >& buckets,
310 std::vector<std::vector<Bucket*> >::const_iterator itr);
313 AllSelectedBucketsRange get_selected_bucket_range(
const AllBucketsRange& bucket_range,
const Selector& selector);
316 SelectedBucketVectorIteratorRange get_selected_bucket_range(
const std::vector<Bucket*>& buckets,
const Selector& selector);
319 SelectedBucketRangeEntityIteratorRange get_selected_bucket_entity_range(
const AllBucketsRange& bucket_range,
const Selector& selector);
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)