From 5719ed1860a475ddfcf3d7119027e4bd7910b0a9 Mon Sep 17 00:00:00 2001
From: Philip Trettner <Philip.Trettner@rwth-aachen.de>
Date: Mon, 23 Nov 2020 13:39:51 +0100
Subject: [PATCH] fixed smart range where

---
 src/polymesh/iterators.hh | 6 ++++++
 src/polymesh/ranges.hh    | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/src/polymesh/iterators.hh b/src/polymesh/iterators.hh
index 5ffc7e1..75fcac9 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 9a6b7be..27f392c 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 {}; }
 
-- 
GitLab