diff --git a/src/polymesh/iterators.hh b/src/polymesh/iterators.hh index 5ffc7e18e451ddd5c795de2eb7460d10d916cc95..75fcac90513a40fc5e63a373531860f37321527d 100644 --- a/src/polymesh/iterators.hh +++ b/src/polymesh/iterators.hh @@ -102,6 +102,12 @@ struct attribute_iterator : smart_iterator<attribute_iterator<AttributeT>> template <class IteratorT, class PredT> struct filtering_iterator final : smart_iterator<filtering_iterator<IteratorT, PredT>> { + filtering_iterator(IteratorT it, PredT p) : it(std::forward<IteratorT>(it)), pred(std::forward<PredT>(p)) + { + if (it.is_valid()) + advance(); // skip initially false elements + } + IteratorT it; PredT pred; diff --git a/src/polymesh/ranges.hh b/src/polymesh/ranges.hh index 9a6b7befaab723def05a48446205dca75b078e1c..27f392c0591412b3e4d08e03a4b5c7df7ae9b74f 100644 --- a/src/polymesh/ranges.hh +++ b/src/polymesh/ranges.hh @@ -185,6 +185,8 @@ struct filtered_range : smart_range<filtered_range<ElementT, RangeT, PredT>, Ele { using IteratorT = decltype(std::declval<RangeT>().begin()); + filtered_range(IteratorT it, PredT p) : it_begin(std::forward<IteratorT>(it)), pred(std::forward<PredT>(p)) {} + filtering_iterator<IteratorT, PredT> begin() const { return {it_begin, pred}; } end_iterator end() const { return {}; }