@@ -113,6 +113,70 @@ namespace osmium {
113113 return out;
114114 }
115115
116+ template <typename TFilter, typename TMember>
117+ class CollectionFilterIterator {
118+
119+ TFilter m_filter;
120+ CollectionIterator<TMember> m_it;
121+ CollectionIterator<TMember> m_end;
122+
123+ void advance () {
124+ while (m_it != m_end) {
125+ if (m_filter (*m_it)) {
126+ break ;
127+ }
128+ ++m_it;
129+ }
130+ }
131+
132+ public:
133+
134+ using iterator_category = std::forward_iterator_tag;
135+ using value_type = const TMember;
136+ using difference_type = std::ptrdiff_t ;
137+ using pointer = value_type*;
138+ using reference = value_type&;
139+
140+ CollectionFilterIterator (const TFilter& filter, CollectionIterator<TMember> begin, CollectionIterator<TMember> end) :
141+ m_filter (filter),
142+ m_it (begin),
143+ m_end (end) {
144+ advance ();
145+ }
146+
147+ CollectionFilterIterator& operator ++() {
148+ assert (m_it != m_end);
149+ ++m_it;
150+ advance ();
151+ return *this ;
152+ }
153+
154+ CollectionFilterIterator operator ++(int ) const {
155+ CollectionFilterIterator tmp{*this };
156+ operator ++();
157+ return tmp;
158+ }
159+
160+ bool operator ==(const CollectionFilterIterator& rhs) const noexcept {
161+ return m_it == rhs.m_it && m_end == rhs.m_end ;
162+ }
163+
164+ bool operator !=(const CollectionFilterIterator& rhs) const noexcept {
165+ return !(*this == rhs);
166+ }
167+
168+ reference operator *() const noexcept {
169+ assert (m_it != m_end);
170+ return *m_it;
171+ }
172+
173+ pointer operator ->() const noexcept {
174+ assert (m_it != m_end);
175+ return &*m_it;
176+ }
177+
178+ }; // class CollectionFilterIterator
179+
116180 template <typename TMember, osmium::item_type TCollectionItemType>
117181 class Collection : public Item {
118182
0 commit comments