From f1bd05aa8fede9ea4bb456e65ccd99463d1b5ac0 Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Mon, 5 Jun 2023 13:33:33 +0000
Subject: [PATCH] algo: Add case-senstive flag to FromString for enum
 conversion.

---
 algo/CMakeLists.txt               |  2 ++
 algo/base/util/SerializableEnum.h | 10 ++++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt
index 1ebaa65559..eabd850ac8 100644
--- a/algo/CMakeLists.txt
+++ b/algo/CMakeLists.txt
@@ -77,6 +77,7 @@ target_link_libraries(Algo
             fmt::fmt
             Boost::program_options
             Boost::filesystem
+            Boost::headers
             xpu
             external::yaml-cpp
             external::fles_logging
@@ -88,6 +89,7 @@ xpu_attach(Algo ${DEVICE_SRCS})
 install(TARGETS Algo DESTINATION lib)
 install(DIRECTORY base/compat TYPE INCLUDE FILES_MATCHING PATTERN "*.h")
 install(DIRECTORY base/config TYPE INCLUDE FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY base/util TYPE INCLUDE FILES_MATCHING PATTERN "*.h")
 install(DIRECTORY base/gpu TYPE INCLUDE FILES_MATCHING PATTERN "*.h")
 install(DIRECTORY data/sts TYPE INCLUDE FILES_MATCHING PATTERN "*.h")
 
diff --git a/algo/base/util/SerializableEnum.h b/algo/base/util/SerializableEnum.h
index 8921b3ef79..84ffd80482 100644
--- a/algo/base/util/SerializableEnum.h
+++ b/algo/base/util/SerializableEnum.h
@@ -4,6 +4,8 @@
 #ifndef CBM_ALGO_BASE_UTIL_SERIALIZABLEENUM_H
 #define CBM_ALGO_BASE_UTIL_SERIALIZABLEENUM_H
 
+#include <boost/algorithm/string/predicate.hpp>
+
 #include <algorithm>
 #include <iostream>
 #include <optional>
@@ -59,10 +61,14 @@ namespace cbm::algo
   inline const EnumDict_t<T> EnumDict;
 
   template<typename T, typename = std::enable_if_t<EnumIsSerializable<T>::value>>
-  std::optional<T> FromString(std::string_view str)
+  std::optional<T> FromString(std::string_view str, bool caseSensitive = false)
   {
     const auto& set = EnumDict<T>;
-    auto it         = std::find_if(set.begin(), set.end(), [str](const auto& pair) { return pair.first == str; });
+    auto it         = std::find_if(set.begin(), set.end(), [&](const auto& pair) {
+      if (caseSensitive) return pair.first == str;
+      else
+        return boost::iequals(pair.first, str);
+    });
     if (it == set.end()) return std::nullopt;
     return it->second;
   }
-- 
GitLab