topology: getAssocs param board paths view

`getAssocs` function received a parameter
```
const std::map<std::string, std::string>& boards
```
which maps object paths to board names, but only queried the object
paths. Pass an `std::view::keys` instead to minimize the API surface.

Tested: Topology Unit Tests Pass

Change-Id: Idca0c0731d90205332b1e85c5e8976a93696f78a
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
diff --git a/src/entity_manager/entity_manager.cpp b/src/entity_manager/entity_manager.cpp
index d17d21a..e5e8b23 100644
--- a/src/entity_manager/entity_manager.cpp
+++ b/src/entity_manager/entity_manager.cpp
@@ -87,7 +87,7 @@
     }
 
     for (const auto& [assocPath, assocPropValue] :
-         topology.getAssocs(newBoards))
+         topology.getAssocs(std::views::keys(newBoards)))
     {
         auto findBoard = newBoards.find(assocPath);
         if (findBoard == newBoards.end())
diff --git a/src/entity_manager/topology.cpp b/src/entity_manager/topology.cpp
index 3b9521c..e798baa 100644
--- a/src/entity_manager/topology.cpp
+++ b/src/entity_manager/topology.cpp
@@ -52,7 +52,7 @@
 }
 
 std::unordered_map<std::string, std::set<Association>> Topology::getAssocs(
-    const std::map<Path, BoardName>& boards)
+    BoardPathsView boardPaths)
 {
     std::unordered_map<std::string, std::set<Association>> result;
 
@@ -75,7 +75,7 @@
                 for (const Path& downstream : downstreamMatch->second)
                 {
                     // The downstream path must be one we care about.
-                    if (boards.contains(downstream))
+                    if (std::ranges::contains(boardPaths, downstream))
                     {
                         result[downstream].insert(
                             {"contained_by", "containing", upstream});
diff --git a/src/entity_manager/topology.hpp b/src/entity_manager/topology.hpp
index a1f00fe..1c2b3eb 100644
--- a/src/entity_manager/topology.hpp
+++ b/src/entity_manager/topology.hpp
@@ -7,6 +7,9 @@
 
 using Association = std::tuple<std::string, std::string, std::string>;
 
+using BoardPathsView = decltype(std::views::keys(
+    std::declval<std::map<std::string, std::string>&>()));
+
 class Topology
 {
   public:
@@ -16,7 +19,7 @@
                   const std::string& boardName,
                   const nlohmann::json& exposesItem);
     std::unordered_map<std::string, std::set<Association>> getAssocs(
-        const std::map<std::string, std::string>& boards);
+        BoardPathsView boardPaths);
     void remove(const std::string& boardName);
 
   private:
diff --git a/test/test_topology.cpp b/test/test_topology.cpp
index a705e9c..f04ce4f 100644
--- a/test/test_topology.cpp
+++ b/test/test_topology.cpp
@@ -1,5 +1,7 @@
 #include "entity_manager/topology.hpp"
 
+#include <ranges>
+
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
@@ -53,7 +55,7 @@
     Topology topo;
     BoardMap boards;
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -66,7 +68,7 @@
     topo.addBoard(subchassisPath, "Chassis", "BoardA", nlohmann::json());
     topo.addBoard(superchassisPath, "Chassis", "BoardB", nlohmann::json());
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -88,7 +90,7 @@
     topo.addBoard(superchassisPath, "Chassis", "BoardB",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -101,7 +103,7 @@
     topo.addBoard(subchassisPath, "Chassis", "BoardA", otherExposesItem);
     topo.addBoard(superchassisPath, "Chassis", "BoardB", otherExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -115,7 +117,7 @@
     topo.addBoard(superchassisPath, "Chassis", "BoardB",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -128,7 +130,7 @@
     topo.addBoard(subchassisPath, "Chassis", "BoardA", subchassisExposesItem);
     topo.addBoard(superchassisPath, "Chassis", "BoardB", otherExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -142,7 +144,7 @@
     topo.addBoard(superchassisPath, "Chassis", "BoardB",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 1U);
     EXPECT_EQ(assocs[subchassisPath].size(), 1U);
@@ -158,7 +160,7 @@
     topo.addBoard(superchassisPath, "Chassis", "BoardB",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 1U);
     EXPECT_EQ(assocs[subchassisPath].size(), 2U);
@@ -176,7 +178,7 @@
                   superchassisExposesItem);
 
     // Boards A and B aren't new, so no assocs are returned.
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 0U);
 }
@@ -194,7 +196,7 @@
     topo.addBoard(superchassisPath, "Chassis", "BoardC",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 2U);
     EXPECT_EQ(assocs[subchassisPath].size(), 1U);
@@ -215,7 +217,7 @@
                   superchassisExposesItem);
 
     // Only the assoc for BoardA should be returned
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 1U);
     EXPECT_EQ(assocs[subchassisPath].size(), 1U);
@@ -224,7 +226,7 @@
 
 TEST(Topology, 2Superchassis)
 {
-    const Association subchassisAssoc2 =
+    Association subchassisAssoc2 =
         std::make_tuple("contained_by", "containing", superchassisPath + "2");
 
     Topology topo;
@@ -238,7 +240,7 @@
     topo.addBoard(superchassisPath + "2", "Chassis", "BoardC",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 1U);
     EXPECT_EQ(assocs[subchassisPath].size(), 2U);
@@ -249,7 +251,7 @@
 
 TEST(Topology, 2SuperchassisAnd2Subchassis)
 {
-    const Association subchassisAssoc2 =
+    Association subchassisAssoc2 =
         std::make_tuple("contained_by", "containing", superchassisPath + "2");
 
     Topology topo;
@@ -266,7 +268,7 @@
     topo.addBoard(superchassisPath + "2", "Chassis", "BoardD",
                   superchassisExposesItem);
 
-    auto assocs = topo.getAssocs(boards);
+    auto assocs = topo.getAssocs(std::views::keys(boards));
 
     EXPECT_EQ(assocs.size(), 2U);
     EXPECT_EQ(assocs[subchassisPath].size(), 2U);
@@ -292,7 +294,7 @@
                   superchassisExposesItem);
 
     {
-        auto assocs = topo.getAssocs(boards);
+        auto assocs = topo.getAssocs(std::views::keys(boards));
 
         EXPECT_EQ(assocs.size(), 2U);
         EXPECT_EQ(assocs[subchassisPath].size(), 1U);
@@ -303,7 +305,7 @@
 
     {
         topo.remove("BoardA");
-        auto assocs = topo.getAssocs(boards);
+        auto assocs = topo.getAssocs(std::views::keys(boards));
 
         EXPECT_EQ(assocs.size(), 1U);
         EXPECT_EQ(assocs[subchassisPath + "2"].size(), 1U);
@@ -312,7 +314,7 @@
 
     {
         topo.remove("BoardB");
-        auto assocs = topo.getAssocs(boards);
+        auto assocs = topo.getAssocs(std::views::keys(boards));
 
         EXPECT_EQ(assocs.size(), 0U);
     }