Make device array constexpr

This map will consume memory the whole time the application runs,
despite not being needed for anything but a lookup at startup.  Move to
a constexpr array and std::find_if so that this struct will always be
const.

Tested: EM boots and detects devices.

Change-Id: Iae95884a8076d991d0d2696dd0c03113ed49a92f
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/src/entity_manager/overlay.cpp b/src/entity_manager/overlay.cpp
index f289715..60e9af6 100644
--- a/src/entity_manager/overlay.cpp
+++ b/src/entity_manager/overlay.cpp
@@ -53,7 +53,7 @@
     return name.str();
 }
 
-void linkMux(const std::string& muxName, uint64_t busIndex, uint64_t address,
+void linkMux(std::string_view muxName, uint64_t busIndex, uint64_t address,
              const std::vector<std::string>& channelNames)
 {
     std::error_code ec;
@@ -98,8 +98,8 @@
     }
 }
 
-static int deleteDevice(const std::string& busPath, uint64_t address,
-                        const std::string& destructor)
+static int deleteDevice(std::string_view busPath, uint64_t address,
+                        std::string_view destructor)
 {
     std::filesystem::path deviceDestructor(busPath);
     deviceDestructor /= destructor;
@@ -114,9 +114,8 @@
     return 0;
 }
 
-static int createDevice(const std::string& busPath,
-                        const std::string& parameters,
-                        const std::string& constructor)
+static int createDevice(std::string_view busPath, std::string_view parameters,
+                        std::string_view constructor)
 {
     std::filesystem::path deviceConstructor(busPath);
     deviceConstructor /= constructor;
@@ -132,7 +131,7 @@
     return 0;
 }
 
-static bool deviceIsCreated(const std::string& busPath, uint64_t bus,
+static bool deviceIsCreated(std::string_view busPath, uint64_t bus,
                             uint64_t address,
                             const devices::createsHWMon hasHWMonDir)
 {
@@ -149,9 +148,9 @@
 }
 
 static int buildDevice(
-    const std::string& name, const std::string& busPath,
-    const std::string& parameters, uint64_t bus, uint64_t address,
-    const std::string& constructor, const std::string& destructor,
+    std::string_view name, std::string_view busPath,
+    std::string_view parameters, uint64_t bus, uint64_t address,
+    std::string_view constructor, std::string_view destructor,
     const devices::createsHWMon hasHWMonDir,
     std::vector<std::string> channelNames, boost::asio::io_context& io,
     const size_t retries = 5)
@@ -203,15 +202,15 @@
     return 0;
 }
 
-void exportDevice(const std::string& type,
-                  const devices::ExportTemplate& exportTemplate,
+void exportDevice(const devices::ExportTemplate& exportTemplate,
                   const nlohmann::json& configuration,
                   boost::asio::io_context& io)
 {
-    std::string parameters = exportTemplate.parameters;
-    std::string busPath = exportTemplate.busPath;
-    std::string constructor = exportTemplate.add;
-    std::string destructor = exportTemplate.remove;
+    std::string_view type = exportTemplate.type;
+    std::string parameters(exportTemplate.parameters);
+    std::string busPath(exportTemplate.busPath);
+    std::string_view constructor = exportTemplate.add;
+    std::string_view destructor = exportTemplate.remove;
     devices::createsHWMon hasHWMonDir = exportTemplate.hasHWMonDir;
     std::string name = "unknown";
     std::optional<uint64_t> bus;
@@ -289,11 +288,13 @@
             {
                 continue;
             }
-            std::string type = findType.value().get<std::string>();
-            auto device = devices::exportTemplates.find(type.c_str());
+            const std::string& type = findType.value().get<std::string>();
+            const auto* device = std::ranges::find_if(
+                devices::exportTemplates,
+                [&type](const auto& tmp) { return tmp.type == type; });
             if (device != devices::exportTemplates.end())
             {
-                exportDevice(type, device->second, configuration, io);
+                exportDevice(*device, configuration, io);
                 continue;
             }