Flat map all the things

In an earlier commit, entity-manager gained required dependency
on std::flat_map.  This means that EM can only compile with gcc-15,
which the project only recently moved to.  Rather than move backwards,
port forward all uses of boost flat_map and flat_set to their std
equivalents.

Tested: entity-manager launches and enumerates devices on
gb200-obmc.

Change-Id: Id24803057711c60d5b00f436db80b27edbb756a3
Signed-off-by: Ed Tanous <etanous@nvidia.com>
diff --git a/src/entity_manager/dbus_interface.cpp b/src/entity_manager/dbus_interface.cpp
index d7169ce..e42d9cd 100644
--- a/src/entity_manager/dbus_interface.cpp
+++ b/src/entity_manager/dbus_interface.cpp
@@ -3,9 +3,9 @@
 #include "perform_probe.hpp"
 #include "utils.hpp"
 
-#include <boost/container/flat_map.hpp>
 #include <phosphor-logging/lg2.hpp>
 
+#include <flat_map>
 #include <fstream>
 #include <regex>
 #include <string>
@@ -249,7 +249,7 @@
         "AddObject",
         [&systemConfiguration, jsonPointerPath{std::string(jsonPointerPath)},
          path{std::string(path)}, board,
-         this](const boost::container::flat_map<std::string, JsonVariantType>&
+         this](const std::flat_map<std::string, JsonVariantType, std::less<>>&
                    data) {
             nlohmann::json::json_pointer ptr(jsonPointerPath);
             nlohmann::json& base = systemConfiguration[ptr];
diff --git a/src/entity_manager/dbus_interface.hpp b/src/entity_manager/dbus_interface.hpp
index 9c20d8f..babc854 100644
--- a/src/entity_manager/dbus_interface.hpp
+++ b/src/entity_manager/dbus_interface.hpp
@@ -8,6 +8,7 @@
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
+#include <flat_map>
 #include <vector>
 
 namespace dbus_interface
diff --git a/src/entity_manager/devices.hpp b/src/entity_manager/devices.hpp
index a2bcffa..ed0f8dc 100644
--- a/src/entity_manager/devices.hpp
+++ b/src/entity_manager/devices.hpp
@@ -2,19 +2,11 @@
 // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation
 
 #pragma once
-#include <boost/container/flat_map.hpp>
+#include <flat_map>
 
 namespace devices
 {
 
-struct CmpStr
-{
-    bool operator()(const char* a, const char* b) const
-    {
-        return std::strcmp(a, b) < 0;
-    }
-};
-
 // I2C device drivers may create a /hwmon subdirectory. For example the tmp75
 // driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon
 // directory. The sensor code relies on the presence of the /hwmon
@@ -50,7 +42,7 @@
     createsHWMon hasHWMonDir;
 };
 
-const boost::container::flat_map<const char*, ExportTemplate, CmpStr>
+const std::flat_map<std::string_view, ExportTemplate, std::less<>>
     exportTemplates{
         {{"EEPROM_24C01",
           ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus",
diff --git a/src/entity_manager/entity_manager.cpp b/src/entity_manager/entity_manager.cpp
index a3b4a72..6bf3c52 100644
--- a/src/entity_manager/entity_manager.cpp
+++ b/src/entity_manager/entity_manager.cpp
@@ -16,7 +16,6 @@
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/post.hpp>
 #include <boost/asio/steady_timer.hpp>
-#include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
 #include <boost/range/iterator_range.hpp>
 #include <nlohmann/json.hpp>
@@ -29,6 +28,7 @@
 #include <xyz/openbmc_project/Inventory/Item/common.hpp>
 
 #include <filesystem>
+#include <flat_map>
 #include <fstream>
 #include <functional>
 #include <map>
diff --git a/src/entity_manager/entity_manager.hpp b/src/entity_manager/entity_manager.hpp
index c21b94e..70f7a4f 100644
--- a/src/entity_manager/entity_manager.hpp
+++ b/src/entity_manager/entity_manager.hpp
@@ -8,11 +8,11 @@
 #include "power_status_monitor.hpp"
 #include "topology.hpp"
 
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
+#include <flat_map>
 #include <string>
 
 class EntityManager
@@ -84,7 +84,7 @@
     boost::asio::steady_timer propertiesChangedTimer;
     size_t propertiesChangedInstance = 0;
 
-    boost::container::flat_map<std::string, sdbusplus::bus::match_t>
+    std::flat_map<std::string, sdbusplus::bus::match_t, std::less<>>
         dbusMatches;
 
     void startRemovedTimer(boost::asio::steady_timer& timer,
diff --git a/src/entity_manager/log_device_inventory.cpp b/src/entity_manager/log_device_inventory.cpp
index 9662c97..93cf156 100644
--- a/src/entity_manager/log_device_inventory.cpp
+++ b/src/entity_manager/log_device_inventory.cpp
@@ -2,10 +2,10 @@
 
 #include <systemd/sd-journal.h>
 
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <xyz/openbmc_project/Inventory/Decorator/Asset/common.hpp>
 
+#include <flat_map>
 #include <string>
 
 struct InvAddRemoveInfo
diff --git a/src/entity_manager/overlay.cpp b/src/entity_manager/overlay.cpp
index ce41bca..f289715 100644
--- a/src/entity_manager/overlay.cpp
+++ b/src/entity_manager/overlay.cpp
@@ -9,12 +9,12 @@
 
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/steady_timer.hpp>
-#include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/lg2.hpp>
 
 #include <filesystem>
+#include <flat_map>
 #include <fstream>
 #include <iomanip>
 #include <regex>
diff --git a/src/entity_manager/perform_probe.cpp b/src/entity_manager/perform_probe.cpp
index e5b57eb..94d3d21 100644
--- a/src/entity_manager/perform_probe.cpp
+++ b/src/entity_manager/perform_probe.cpp
@@ -184,7 +184,7 @@
     if (ret && foundDevs.empty())
     {
         foundDevs.emplace_back(
-            boost::container::flat_map<std::string, DBusValueVariant>{},
+            std::flat_map<std::string, DBusValueVariant, std::less<>>{},
             std::string{});
     }
     if (matchOne && ret)
@@ -220,8 +220,7 @@
 
 FoundProbeTypeT findProbeType(const std::string& probe)
 {
-    static const boost::container::flat_map<const char*, probe_type_codes,
-                                            CmpStr>
+    static const std::flat_map<std::string_view, probe_type_codes, std::less<>>
         probeTypes{{{"FALSE", probe_type_codes::FALSE_T},
                     {"TRUE", probe_type_codes::TRUE_T},
                     {"AND", probe_type_codes::AND},
@@ -229,8 +228,8 @@
                     {"FOUND", probe_type_codes::FOUND},
                     {"MATCH_ONE", probe_type_codes::MATCH_ONE}}};
 
-    boost::container::flat_map<const char*, probe_type_codes,
-                               CmpStr>::const_iterator probeType;
+    std::flat_map<std::string_view, probe_type_codes,
+                  std::less<>>::const_iterator probeType;
     for (probeType = probeTypes.begin(); probeType != probeTypes.end();
          ++probeType)
     {
diff --git a/src/entity_manager/perform_probe.hpp b/src/entity_manager/perform_probe.hpp
index 69c5375..0fdf674 100644
--- a/src/entity_manager/perform_probe.hpp
+++ b/src/entity_manager/perform_probe.hpp
@@ -2,21 +2,13 @@
 
 #include "perform_scan.hpp"
 
-#include <boost/container/flat_map.hpp>
-
+#include <flat_map>
 #include <memory>
 #include <string>
 #include <vector>
 
 namespace probe
 {
-struct CmpStr
-{
-    bool operator()(const char* a, const char* b) const
-    {
-        return std::strcmp(a, b) < 0;
-    }
-};
 
 // underscore T for collison with dbus c api
 enum class probe_type_codes
diff --git a/src/entity_manager/perform_scan.cpp b/src/entity_manager/perform_scan.cpp
index 6ba362b..85eb723 100644
--- a/src/entity_manager/perform_scan.cpp
+++ b/src/entity_manager/perform_scan.cpp
@@ -7,11 +7,11 @@
 #include "utils.hpp"
 
 #include <boost/asio/steady_timer.hpp>
-#include <boost/container/flat_map.hpp>
-#include <boost/container/flat_set.hpp>
 #include <phosphor-logging/lg2.hpp>
 
 #include <charconv>
+#include <flat_map>
+#include <flat_set>
 
 using GetSubTreeType = std::vector<
     std::pair<std::string,
@@ -42,7 +42,8 @@
 
     scan->_em.systemBus->async_method_call(
         [instance, scan, probeVector, retries,
-         &io](boost::system::error_code& errc, const DBusInterface& resp) {
+         &io](boost::system::error_code& errc,
+              const DBusInterface& resp) mutable {
             if (errc)
             {
                 lg2::error("error calling getall on {BUSNAME} {PATH} {INTF}",
@@ -59,7 +60,8 @@
                 return;
             }
 
-            scan->dbusProbeObjects[instance.path][instance.interface] = resp;
+            scan->dbusProbeObjects[std::string(instance.path)]
+                                  [std::string(instance.interface)] = resp;
         },
         instance.busName, instance.path, "org.freedesktop.DBus.Properties",
         "GetAll", instance.interface);
@@ -97,7 +99,7 @@
 // for the paths that own the interfaces passed in.
 void findDbusObjects(
     std::vector<std::shared_ptr<probe::PerformProbe>>&& probeVector,
-    boost::container::flat_set<std::string>&& interfaces,
+    std::flat_set<std::string, std::less<>>&& interfaces,
     const std::shared_ptr<scan::PerformScan>& scan, boost::asio::io_context& io,
     size_t retries = 5)
 {
@@ -540,7 +542,7 @@
 
 void scan::PerformScan::run()
 {
-    boost::container::flat_set<std::string> dbusProbeInterfaces;
+    std::flat_set<std::string, std::less<>> dbusProbeInterfaces;
     std::vector<std::shared_ptr<probe::PerformProbe>> dbusProbePointers;
 
     for (auto it = _configurations.begin(); it != _configurations.end();)
diff --git a/src/entity_manager/perform_scan.hpp b/src/entity_manager/perform_scan.hpp
index 317177e..fc8382d 100644
--- a/src/entity_manager/perform_scan.hpp
+++ b/src/entity_manager/perform_scan.hpp
@@ -5,10 +5,10 @@
 
 #include <systemd/sd-journal.h>
 
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
+#include <flat_map>
 #include <functional>
 #include <list>
 #include <vector>
diff --git a/src/entity_manager/utils.hpp b/src/entity_manager/utils.hpp
index 04aa992..a8bba16 100644
--- a/src/entity_manager/utils.hpp
+++ b/src/entity_manager/utils.hpp
@@ -1,15 +1,16 @@
 #pragma once
 
 #include <boost/asio/io_context.hpp>
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <sdbusplus/asio/connection.hpp>
 
+#include <flat_map>
+
 using DBusValueVariant =
     std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
                  int16_t, uint16_t, uint8_t, bool, std::vector<uint8_t>>;
-using DBusInterface = boost::container::flat_map<std::string, DBusValueVariant>;
-using DBusObject = boost::container::flat_map<std::string, DBusInterface>;
+using DBusInterface = std::flat_map<std::string, DBusValueVariant, std::less<>>;
+using DBusObject = std::flat_map<std::string, DBusInterface, std::less<>>;
 
 constexpr const char* configurationOutDir = "/var/configuration/";
 constexpr const char* versionHashFile = "/var/configuration/version";
diff --git a/src/fru_device/fru_device.cpp b/src/fru_device/fru_device.cpp
index 3d806a2..304cb0b 100644
--- a/src/fru_device/fru_device.cpp
+++ b/src/fru_device/fru_device.cpp
@@ -10,7 +10,6 @@
 
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/steady_timer.hpp>
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/asio/connection.hpp>
@@ -22,6 +21,8 @@
 #include <chrono>
 #include <ctime>
 #include <filesystem>
+#include <flat_map>
+#include <flat_set>
 #include <fstream>
 #include <functional>
 #include <future>
@@ -60,16 +61,15 @@
 
 // TODO Refactor these to not be globals
 // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
-static boost::container::flat_map<size_t, std::optional<std::set<size_t>>>
-    busBlocklist;
+static std::flat_map<size_t, std::optional<std::flat_set<size_t>>> busBlocklist;
 struct FindDevicesWithCallback;
 
-static boost::container::flat_map<
-    std::pair<size_t, size_t>, std::shared_ptr<sdbusplus::asio::dbus_interface>>
+static std::flat_map<std::pair<size_t, size_t>,
+                     std::shared_ptr<sdbusplus::asio::dbus_interface>>
     foundDevices;
 
-static boost::container::flat_map<size_t, std::set<size_t>> failedAddresses;
-static boost::container::flat_map<size_t, std::set<size_t>> fruAddresses;
+static std::flat_map<size_t, std::flat_set<size_t>> failedAddresses;
+static std::flat_map<size_t, std::flat_set<size_t>> fruAddresses;
 
 boost::asio::io_context io;
 // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
@@ -77,9 +77,9 @@
 bool updateFruProperty(
     const std::string& propertyValue, uint32_t bus, uint32_t address,
     const std::string& propertyName,
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     size_t& unknownBusObjectCount, const bool& powerIsOn,
     const std::set<size_t>& addressBlocklist,
     sdbusplus::asio::object_server& objServer);
@@ -454,8 +454,8 @@
 
         // Scan for i2c eeproms loaded on this bus.
         std::set<size_t> skipList = findI2CEeproms(bus, devices);
-        std::set<size_t>& failedItems = failedAddresses[bus];
-        std::set<size_t>& foundItems = fruAddresses[bus];
+        std::flat_set<size_t>& failedItems = failedAddresses[bus];
+        std::flat_set<size_t>& foundItems = fruAddresses[bus];
         foundItems.clear();
 
         skipList.insert_range(addressBlocklist);
@@ -472,7 +472,7 @@
             }
         }
 
-        std::set<size_t>* rootFailures = nullptr;
+        std::flat_set<size_t>* rootFailures = nullptr;
         int rootBus = getRootBus(bus);
 
         if (rootBus >= 0)
@@ -875,14 +875,14 @@
 
 void addFruObjectToDbus(
     std::vector<uint8_t>& device,
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     uint32_t bus, uint32_t address, size_t& unknownBusObjectCount,
     const bool& powerIsOn, const std::set<size_t>& addressBlocklist,
     sdbusplus::asio::object_server& objServer)
 {
-    boost::container::flat_map<std::string, std::string> formattedFRU;
+    std::flat_map<std::string, std::string, std::less<>> formattedFRU;
 
     std::optional<std::string> optionalProductName = getProductName(
         device, formattedFRU, bus, address, unknownBusObjectCount);
@@ -928,7 +928,7 @@
             });
     }
 
-    for (auto& property : formattedFRU)
+    for (auto property : formattedFRU)
     {
         std::regex_replace(property.second.begin(), property.second.begin(),
                            property.second.end(), nonAsciiRegex, "_");
@@ -1005,7 +1005,7 @@
 
 bool writeFRU(uint8_t bus, uint8_t address, const std::vector<uint8_t>& fru)
 {
-    boost::container::flat_map<std::string, std::string> tmp;
+    std::flat_map<std::string, std::string, std::less<>> tmp;
     if (fru.size() > maxFruSize)
     {
         lg2::error("Invalid fru.size() during writeFRU");
@@ -1146,9 +1146,9 @@
 
 void rescanOneBus(
     BusMap& busmap, uint16_t busNum,
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     bool dbusCall, size_t& unknownBusObjectCount, const bool& powerIsOn,
     const std::set<size_t>& addressBlocklist,
     sdbusplus::asio::object_server& objServer)
@@ -1203,7 +1203,7 @@
             {
                 return;
             }
-            for (auto& device : *(found->second))
+            for (auto device : *(found->second))
             {
                 addFruObjectToDbus(device.second, dbusInterfaceMap,
                                    static_cast<uint32_t>(busNum), device.first,
@@ -1216,9 +1216,9 @@
 
 void rescanBusses(
     BusMap& busmap,
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     size_t& unknownBusObjectCount, const bool& powerIsOn,
     const std::set<size_t>& addressBlocklist,
     sdbusplus::asio::object_server& objServer)
@@ -1242,7 +1242,7 @@
         auto devDir = fs::path("/dev/");
         std::vector<fs::path> i2cBuses;
 
-        boost::container::flat_map<size_t, fs::path> busPaths;
+        std::flat_map<size_t, fs::path> busPaths;
         if (!getI2cDevicePaths(devDir, busPaths))
         {
             lg2::error("unable to find i2c devices");
@@ -1255,7 +1255,7 @@
         }
 
         busmap.clear();
-        for (auto& [pair, interface] : foundDevices)
+        for (auto [pair, interface] : foundDevices)
         {
             objServer.remove_interface(interface);
         }
@@ -1263,7 +1263,7 @@
 
         auto scan = std::make_shared<FindDevicesWithCallback>(
             i2cBuses, busmap, powerIsOn, objServer, addressBlocklist, [&]() {
-                for (auto& busIface : dbusInterfaceMap)
+                for (auto busIface : dbusInterfaceMap)
                 {
                     objServer.remove_interface(busIface.second);
                 }
@@ -1280,9 +1280,9 @@
                         busmap.try_emplace(0, std::make_shared<DeviceMap>());
                     bus0.first->second->emplace(0, baseboardFRU);
                 }
-                for (auto& devicemap : busmap)
+                for (auto devicemap : busmap)
                 {
-                    for (auto& device : *devicemap.second)
+                    for (auto device : *devicemap.second)
                     {
                         addFruObjectToDbus(device.second, dbusInterfaceMap,
                                            devicemap.first, device.first,
@@ -1298,9 +1298,9 @@
 bool updateFruProperty(
     const std::string& propertyValue, uint32_t bus, uint32_t address,
     const std::string& propertyName,
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     size_t& unknownBusObjectCount, const bool& powerIsOn,
     const std::set<size_t>& addressBlocklist,
     sdbusplus::asio::object_server& objServer)
@@ -1364,8 +1364,8 @@
 
     // this is a map with keys of pair(bus number, address) and values of
     // the object on dbus
-    boost::container::flat_map<std::pair<size_t, size_t>,
-                               std::shared_ptr<sdbusplus::asio::dbus_interface>>
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>
         dbusInterfaceMap;
 
     std::shared_ptr<sdbusplus::asio::dbus_interface> iface =
@@ -1401,9 +1401,8 @@
     std::function<void(sdbusplus::message_t & message)> eventHandler =
         [&](sdbusplus::message_t& message) {
             std::string objectName;
-            boost::container::flat_map<
-                std::string,
-                std::variant<std::string, bool, int64_t, uint64_t, double>>
+            std::flat_map<std::string, std::variant<std::string, bool, int64_t,
+                                                    uint64_t, double>>
                 values;
             message.read(objectName, values);
             auto findState = values.find("CurrentHostState");
diff --git a/src/fru_device/fru_utils.cpp b/src/fru_device/fru_utils.cpp
index efb4ec1..1efcd30 100644
--- a/src/fru_device/fru_utils.cpp
+++ b/src/fru_device/fru_utils.cpp
@@ -277,7 +277,7 @@
 
 static void parseMultirecordUUID(
     std::span<const uint8_t> device,
-    boost::container::flat_map<std::string, std::string>& result)
+    std::flat_map<std::string, std::string, std::less<>>& result)
 {
     constexpr size_t uuidDataLen = 16;
     constexpr size_t multiRecordHeaderLen = 5;
@@ -364,7 +364,7 @@
     std::span<const uint8_t>::const_iterator& fruBytesIterEndArea,
     const std::vector<std::string>& fruAreaFieldNames, size_t& fieldIndex,
     DecodeState& state, bool isLangEng, const fruAreas& area,
-    boost::container::flat_map<std::string, std::string>& result)
+    std::flat_map<std::string, std::string, std::less<>>& result)
 {
     auto res = decodeFRUData(fruBytesIter, fruBytesIterEndArea, isLangEng);
     state = res.first;
@@ -432,7 +432,7 @@
 
 resCodes formatIPMIFRU(
     std::span<const uint8_t> fruBytes,
-    boost::container::flat_map<std::string, std::string>& result)
+    std::flat_map<std::string, std::string, std::less<>>& result)
 {
     resCodes ret = resCodes::resOK;
     if (fruBytes.size() <= fruBlockSize)
@@ -1594,9 +1594,9 @@
 // regular expression and find the device index for all devices.
 
 std::optional<int> findIndexForFRU(
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     std::string& productName)
 {
     int highest = -1;
@@ -1640,7 +1640,7 @@
 
 std::optional<std::string> getProductName(
     std::vector<uint8_t>& device,
-    boost::container::flat_map<std::string, std::string>& formattedFRU,
+    std::flat_map<std::string, std::string, std::less<>>& formattedFRU,
     uint32_t bus, uint32_t address, size_t& unknownBusObjectCount)
 {
     std::string productName;
diff --git a/src/fru_device/fru_utils.hpp b/src/fru_device/fru_utils.hpp
index d689d5c..1465a9d 100644
--- a/src/fru_device/fru_utils.hpp
+++ b/src/fru_device/fru_utils.hpp
@@ -4,11 +4,11 @@
 #pragma once
 #include "fru_reader.hpp"
 
-#include <boost/container/flat_map.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
 #include <cstdint>
 #include <cstdio>
+#include <flat_map>
 #include <functional>
 #include <regex>
 #include <string>
@@ -22,8 +22,8 @@
 
 constexpr size_t fruBlockSize = 8;
 
-using DeviceMap = boost::container::flat_map<int, std::vector<uint8_t>>;
-using BusMap = boost::container::flat_map<int, std::shared_ptr<DeviceMap>>;
+using DeviceMap = std::flat_map<int, std::vector<uint8_t>>;
+using BusMap = std::flat_map<int, std::shared_ptr<DeviceMap>>;
 
 // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
 inline BusMap busMap;
@@ -111,7 +111,7 @@
 
 resCodes formatIPMIFRU(
     std::span<const uint8_t> fruBytes,
-    boost::container::flat_map<std::string, std::string>& result);
+    std::flat_map<std::string, std::string, std::less<>>& result);
 
 std::vector<uint8_t>& getFRUInfo(const uint16_t& bus, const uint8_t& address);
 
@@ -198,9 +198,9 @@
 /// \return optional<int> highest index for fru device on success, return
 /// nullopt on failure.
 std::optional<int> findIndexForFRU(
-    boost::container::flat_map<
-        std::pair<size_t, size_t>,
-        std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
+    std::flat_map<std::pair<size_t, size_t>,
+                  std::shared_ptr<sdbusplus::asio::dbus_interface>>&
+        dbusInterfaceMap,
     std::string& productName);
 
 /// \brief It does format fru data and find productName in the formatted
@@ -214,7 +214,7 @@
 
 std::optional<std::string> getProductName(
     std::vector<uint8_t>& device,
-    boost::container::flat_map<std::string, std::string>& formattedFRU,
+    std::flat_map<std::string, std::string, std::less<>>& formattedFRU,
     uint32_t bus, uint32_t address, size_t& unknownBusObjectCount);
 
 bool getFruData(std::vector<uint8_t>& fruData, uint32_t bus, uint32_t address);
diff --git a/src/gpio-presence/config_provider.cpp b/src/gpio-presence/config_provider.cpp
index 2f522b4..e5089e4 100644
--- a/src/gpio-presence/config_provider.cpp
+++ b/src/gpio-presence/config_provider.cpp
@@ -4,12 +4,12 @@
  */
 #include "config_provider.hpp"
 
-#include <boost/container/flat_map.hpp>
 #include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/async/match.hpp>
 #include <sdbusplus/bus/match.hpp>
 #include <xyz/openbmc_project/ObjectMapper/client.hpp>
 
+#include <flat_map>
 #include <ranges>
 #include <string>
 
@@ -18,8 +18,8 @@
 using VariantType =
     std::variant<std::vector<std::string>, std::string, int64_t, uint64_t,
                  double, int32_t, uint32_t, int16_t, uint16_t, uint8_t, bool>;
-using ConfigMap = boost::container::flat_map<std::string, VariantType>;
-using ConfigData = boost::container::flat_map<std::string, ConfigMap>;
+using ConfigMap = std::flat_map<std::string, VariantType>;
+using ConfigData = std::flat_map<std::string, ConfigMap>;
 
 namespace gpio_presence
 {
diff --git a/src/utils.cpp b/src/utils.cpp
index b5bac09..db476f3 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -3,7 +3,6 @@
 
 #include "utils.hpp"
 
-#include <boost/container/flat_map.hpp>
 #include <boost/lexical_cast.hpp>
 #include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/bus/match.hpp>
@@ -11,6 +10,7 @@
 #include <algorithm>
 #include <cctype>
 #include <filesystem>
+#include <flat_map>
 #include <map>
 #include <ranges>
 #include <regex>
@@ -79,7 +79,7 @@
 }
 
 bool getI2cDevicePaths(const fs::path& dirPath,
-                       boost::container::flat_map<size_t, fs::path>& busPaths)
+                       std::flat_map<size_t, fs::path>& busPaths)
 {
     if (!fs::exists(dirPath))
     {
diff --git a/src/utils.hpp b/src/utils.hpp
index 368de5a..b14a620 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -3,21 +3,21 @@
 
 #pragma once
 
-#include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/exception.hpp>
 
 #include <charconv>
 #include <filesystem>
+#include <flat_map>
 
 using DBusValueVariant =
     std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
                  int16_t, uint16_t, uint8_t, bool, std::vector<uint8_t>>;
-using DBusInterface = boost::container::flat_map<std::string, DBusValueVariant>;
-using DBusObject = boost::container::flat_map<std::string, DBusInterface>;
+using DBusInterface = std::flat_map<std::string, DBusValueVariant, std::less<>>;
+using DBusObject = std::flat_map<std::string, DBusInterface, std::less<>>;
 using MapperGetSubTreeResponse =
-    boost::container::flat_map<std::string, DBusObject>;
+    std::flat_map<std::string, DBusObject, std::less<>>;
 using FirstIndex = size_t;
 using LastIndex = size_t;
 
@@ -28,9 +28,8 @@
                const std::string& matchString,
                std::vector<std::filesystem::path>& foundPaths);
 
-bool getI2cDevicePaths(
-    const std::filesystem::path& dirPath,
-    boost::container::flat_map<size_t, std::filesystem::path>& busPaths);
+bool getI2cDevicePaths(const std::filesystem::path& dirPath,
+                       std::flat_map<size_t, std::filesystem::path>& busPaths);
 
 struct DBusInternalError final : public sdbusplus::exception_t
 {