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/devices.hpp b/src/entity_manager/devices.hpp
index ed0f8dc..6437e32 100644
--- a/src/entity_manager/devices.hpp
+++ b/src/entity_manager/devices.hpp
@@ -2,7 +2,7 @@
 // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation
 
 #pragma once
-#include <flat_map>
+#include <array>
 
 namespace devices
 {
@@ -31,165 +31,89 @@
 
 struct ExportTemplate
 {
-    ExportTemplate(const char* params, const char* bus, const char* constructor,
-                   const char* destructor, createsHWMon hasHWMonDir) :
-        parameters(params), busPath(bus), add(constructor), remove(destructor),
-        hasHWMonDir(hasHWMonDir) {};
-    const char* parameters;
-    const char* busPath;
-    const char* add;
-    const char* remove;
+    std::string_view type;
+    std::string_view parameters;
+    std::string_view busPath;
+    std::string_view add;
+    std::string_view remove;
     createsHWMon hasHWMonDir;
 };
 
-const std::flat_map<std::string_view, ExportTemplate, std::less<>>
-    exportTemplates{
-        {{"EEPROM_24C01",
-          ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C02",
-          ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C04",
-          ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C08",
-          ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C16",
-          ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C32",
-          ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C64",
-          ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C128",
-          ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM_24C256",
-          ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"ADS1015",
-          ExportTemplate("ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"ADS7828",
-          ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"EEPROM",
-          ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export",
-                                 "unexport", createsHWMon::noHWMonDir)},
-         {"IPSPS1",
-          ExportTemplate("ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"MAX34440",
-          ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"PCA9537",
-          ExportTemplate("pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9542Mux",
-          ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9543Mux",
-          ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9544Mux",
-          ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9545Mux",
-          ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9546Mux",
-          ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9547Mux",
-          ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9548Mux",
-          ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9846Mux",
-          ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9847Mux",
-          ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9848Mux",
-          ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"PCA9849Mux",
-          ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"SIC450",
-          ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"Q50SN12072",
-          ExportTemplate("q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"MAX31790",
-          ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"PIC32", ExportTemplate("pic32 $Address",
-                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
-                                  "delete_device", createsHWMon::hasHWMonDir)},
-         {"INA226",
-          ExportTemplate("ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"RAA229620",
-          ExportTemplate("raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"RAA229621",
-          ExportTemplate("raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"PIC32", ExportTemplate("pic32 $Address",
-                                  "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
-                                  "delete_device", createsHWMon::hasHWMonDir)},
-         {"INA233",
-          ExportTemplate("ina233 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)},
-         {"RTQ6056",
-          ExportTemplate("rtq6056 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::noHWMonDir)},
-         {"SY24655",
-          ExportTemplate("sy24655 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
-                         "new_device", "delete_device",
-                         createsHWMon::hasHWMonDir)}}};
+constexpr auto exportTemplates = std::to_array<ExportTemplate>(
+    {{"EEPROM_24C01", "24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C02", "24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C04", "24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C08", "24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C16", "24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C32", "24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C64", "24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C128", "24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM_24C256", "24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"ADS1015", "ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"ADS7828", "ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"EEPROM", "eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"Gpio", "$Index", "/sys/class/gpio", "export", "unexport",
+      createsHWMon::noHWMonDir},
+     {"IPSPS1", "ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"MAX34440", "max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"PCA9537", "pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9542Mux", "pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9543Mux", "pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9544Mux", "pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9545Mux", "pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9546Mux", "pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9547Mux", "pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9548Mux", "pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9846Mux", "pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9847Mux", "pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9848Mux", "pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"PCA9849Mux", "pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"SIC450", "sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"Q50SN12072", "q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"MAX31790", "max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"PIC32", "pic32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+      "delete_device", createsHWMon::hasHWMonDir},
+     {"INA226", "ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"RAA229620", "raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"RAA229621", "raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"PIC32", "pic32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", "new_device",
+      "delete_device", createsHWMon::hasHWMonDir},
+     {"INA233", "ina233 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir},
+     {"RTQ6056", "rtq6056 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::noHWMonDir},
+     {"SY24655", "sy24655 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
+      "new_device", "delete_device", createsHWMon::hasHWMonDir}});
 } // namespace devices
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;
             }