From 2aa8f856cb183e33faaaed2ec4844a28da8308b8 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Thu, 23 Jun 2022 23:51:23 +0200 Subject: [PATCH] [MeL] Use ranges and ids In: - createMeshFromElementSelection: creation of bulk node ids - createMeshFromElementSelection: iteration over a map of nodes - findElementsConnectedToNodes: iteration over element's nodes - Mesh copy constructor: iteration over cloned elements --- MeshLib/Mesh.cpp | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/MeshLib/Mesh.cpp b/MeshLib/Mesh.cpp index 2270f8b177f..20c02230654 100644 --- a/MeshLib/Mesh.cpp +++ b/MeshLib/Mesh.cpp @@ -47,10 +47,8 @@ std::vector<std::vector<Element const*>> findElementsConnectedToNodes( for (auto const* element : mesh.getElements()) { - unsigned const number_nodes(element->getNumberOfNodes()); - for (unsigned j = 0; j < number_nodes; ++j) + for (auto const node_id : element->nodes() | views::ids) { - auto const node_id = element->getNode(j)->getID(); elements_connected_to_nodes[node_id].push_back(element); } } @@ -103,11 +101,11 @@ Mesh::Mesh(const Mesh& mesh) const std::size_t nElements(elements.size()); for (unsigned i = 0; i < nElements; ++i) { - const std::size_t nElemNodes = elements[i]->getNumberOfNodes(); _elements[i] = elements[i]->clone(); - for (unsigned j = 0; j < nElemNodes; ++j) + for (auto const& [j, node_id] : + elements[i]->nodes() | views::ids | ranges::views::enumerate) { - _elements[i]->setNode(j, _nodes[elements[i]->getNode(j)->getID()]); + _elements[i]->setNode(static_cast<unsigned>(j), _nodes[node_id]); } } @@ -274,14 +272,12 @@ PropertyVector<int> const* materialIDs(Mesh const& mesh) std::unique_ptr<MeshLib::Mesh> createMeshFromElementSelection( std::string mesh_name, std::vector<MeshLib::Element*> const& elements) { + auto ids_vector = views::ids | to<std::vector>(); + DBUG("Found {:d} elements in the mesh", elements.size()); // Store bulk element ids for each of the new elements. - std::vector<std::size_t> bulk_element_ids; - bulk_element_ids.reserve(elements.size()); - std::transform(begin(elements), end(elements), - std::back_inserter(bulk_element_ids), - [&](auto const& e) { return e->getID(); }); + auto bulk_element_ids = elements | ids_vector; // original node pointers to newly created nodes. std::unordered_map<const MeshLib::Node*, MeshLib::Node*> nodes_map; @@ -309,18 +305,10 @@ std::unique_ptr<MeshLib::Mesh> createMeshFromElementSelection( } // Copy the unique nodes pointers. - std::vector<MeshLib::Node*> element_nodes; - element_nodes.reserve(nodes_map.size()); - std::transform(begin(nodes_map), end(nodes_map), - std::back_inserter(element_nodes), - [](auto const& pair) { return pair.second; }); + auto element_nodes = nodes_map | ranges::views::values | to<std::vector>; // Store bulk node ids for each of the new nodes. - std::vector<std::size_t> bulk_node_ids; - bulk_node_ids.reserve(nodes_map.size()); - std::transform(begin(nodes_map), end(nodes_map), - std::back_inserter(bulk_node_ids), - [](auto const& pair) { return pair.first->getID(); }); + auto bulk_node_ids = nodes_map | ranges::views::keys | ids_vector; auto mesh = std::make_unique<MeshLib::Mesh>( std::move(mesh_name), std::move(element_nodes), std::move(elements)); -- GitLab