From 290f8f541488875aaafce57af722d71aa9058319 Mon Sep 17 00:00:00 2001 From: Max Lyon Date: Tue, 24 Mar 2020 15:40:26 +0100 Subject: [PATCH] add for_each to smart ranges --- src/OpenMesh/Core/Mesh/SmartRange.hh | 15 +++++++++++++++ src/Unittests/unittests_smart_ranges.cc | 23 +++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/OpenMesh/Core/Mesh/SmartRange.hh b/src/OpenMesh/Core/Mesh/SmartRange.hh index 0c2ceaad..60fefdd8 100644 --- a/src/OpenMesh/Core/Mesh/SmartRange.hh +++ b/src/OpenMesh/Core/Mesh/SmartRange.hh @@ -371,6 +371,21 @@ struct SmartRangeT } + /** @brief Apply a functor to each element. + * + * Calls functor \p f with each element as parameter + * + * @param f Functor that is called for each element. + */ + template + auto for_each(Functor&& f) -> void + { + auto range = static_cast(this); + for (const auto& e : *range) + f(e); + } + + }; diff --git a/src/Unittests/unittests_smart_ranges.cc b/src/Unittests/unittests_smart_ranges.cc index 564e8ef9..c9c3bed9 100644 --- a/src/Unittests/unittests_smart_ranges.cc +++ b/src/Unittests/unittests_smart_ranges.cc @@ -197,7 +197,7 @@ TEST_F(OpenMeshSmartRanges, Sum) */ TEST_F(OpenMeshSmartRanges, PropertyManagerAsFunctor) { - auto myPos = OpenMesh::makeTemporaryProperty(mesh_); + OpenMesh::VProp myPos(mesh_); for (auto vh : mesh_.vertices()) myPos(vh) = mesh_.point(vh); @@ -215,7 +215,7 @@ TEST_F(OpenMeshSmartRanges, PropertyManagerAsFunctor) */ TEST_F(OpenMeshSmartRanges, ToVector) { - auto uvs = OpenMesh::makeTemporaryProperty(mesh_); + OpenMesh::HProp uvs(mesh_); for (auto heh : mesh_.halfedges()) uvs(heh) = OpenMesh::Vec2d(heh.idx(), (heh.idx() * 13)%7); @@ -237,7 +237,7 @@ TEST_F(OpenMeshSmartRanges, ToVector) */ TEST_F(OpenMeshSmartRanges, ToArray) { - auto uvs = OpenMesh::makeTemporaryProperty(mesh_); + OpenMesh::HProp uvs(mesh_); for (auto heh : mesh_.halfedges()) uvs(heh) = OpenMesh::Vec2d(heh.idx(), (heh.idx() * 13)%7); @@ -256,7 +256,7 @@ TEST_F(OpenMeshSmartRanges, BoundingBox) { // The custom vecs OpenMesh are tested with here do not implement a min or max function. // Thus we convert here. - auto myPos = OpenMesh::makeTemporaryProperty(mesh_); + OpenMesh::VProp myPos(mesh_); for (auto vh : mesh_.vertices()) for (size_t i = 0; i < 3; ++i) myPos(vh)[i] = mesh_.point(vh)[i]; @@ -281,5 +281,20 @@ TEST_F(OpenMeshSmartRanges, BoundingBox) } +/* Test for each + */ +TEST_F(OpenMeshSmartRanges, ForEach) +{ + std::vector vec; + auto f = [&vec](OpenMesh::VertexHandle vh) { vec.push_back(vh.idx()); }; + + mesh_.vertices().for_each(f); + + ASSERT_EQ(vec.size(), mesh_.n_vertices()) << "vec has wrong size"; + for (size_t i = 0; i < vec.size(); ++i) + EXPECT_EQ(vec[i], i) << "wrong index in vector"; +} + + }