summaryrefslogtreecommitdiffstats
path: root/src/core/config
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/config')
-rw-r--r--src/core/config/CMakeLists.txt7
-rw-r--r--src/core/config/boolean.cc43
-rw-r--r--src/core/config/boolean.hh25
-rw-r--r--src/core/config/ivalue.hh11
-rw-r--r--src/core/config/number.hh130
-rw-r--r--src/core/config/string.cc18
-rw-r--r--src/core/config/string.hh31
7 files changed, 265 insertions, 0 deletions
diff --git a/src/core/config/CMakeLists.txt b/src/core/config/CMakeLists.txt
new file mode 100644
index 0000000..39752d4
--- /dev/null
+++ b/src/core/config/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources(core PRIVATE
+ "${CMAKE_CURRENT_LIST_DIR}/boolean.cc"
+ "${CMAKE_CURRENT_LIST_DIR}/boolean.hh"
+ "${CMAKE_CURRENT_LIST_DIR}/ivalue.hh"
+ "${CMAKE_CURRENT_LIST_DIR}/number.hh"
+ "${CMAKE_CURRENT_LIST_DIR}/string.cc"
+ "${CMAKE_CURRENT_LIST_DIR}/string.hh")
diff --git a/src/core/config/boolean.cc b/src/core/config/boolean.cc
new file mode 100644
index 0000000..45d5a38
--- /dev/null
+++ b/src/core/config/boolean.cc
@@ -0,0 +1,43 @@
+#include "core/pch.hh"
+
+#include "core/config/boolean.hh"
+
+config::Boolean::Boolean(bool default_value)
+{
+ m_value = default_value;
+}
+
+void config::Boolean::set(std::string_view value)
+{
+ m_value = from_string(value);
+}
+
+std::string_view config::Boolean::get(void) const
+{
+ return to_string(m_value);
+}
+
+bool config::Boolean::get_value(void) const
+{
+ return m_value;
+}
+
+void config::Boolean::set_value(bool value)
+{
+ m_value = value;
+}
+
+std::string_view config::Boolean::to_string(bool value)
+{
+ if(value) {
+ return "true";
+ }
+ else {
+ return "false";
+ }
+}
+
+bool config::Boolean::from_string(std::string_view value)
+{
+ return value == "true" && value != "false";
+}
diff --git a/src/core/config/boolean.hh b/src/core/config/boolean.hh
new file mode 100644
index 0000000..cfd8b0b
--- /dev/null
+++ b/src/core/config/boolean.hh
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "core/config/ivalue.hh"
+
+namespace config
+{
+class Boolean : public IValue {
+public:
+ explicit Boolean(bool default_value = false);
+ virtual ~Boolean(void) = default;
+
+ virtual void set(std::string_view value) override;
+ virtual std::string_view get(void) const override;
+
+ bool get_value(void) const;
+ void set_value(bool value);
+
+private:
+ bool m_value;
+
+public:
+ static std::string_view to_string(bool value);
+ static bool from_string(std::string_view value);
+};
+} // namespace config
diff --git a/src/core/config/ivalue.hh b/src/core/config/ivalue.hh
new file mode 100644
index 0000000..13e9a3a
--- /dev/null
+++ b/src/core/config/ivalue.hh
@@ -0,0 +1,11 @@
+#pragma once
+
+namespace config
+{
+class IValue {
+public:
+ virtual ~IValue(void) = default;
+ virtual void set(std::string_view value) = 0;
+ virtual std::string_view get(void) const = 0;
+};
+} // namespace config
diff --git a/src/core/config/number.hh b/src/core/config/number.hh
new file mode 100644
index 0000000..4f185e1
--- /dev/null
+++ b/src/core/config/number.hh
@@ -0,0 +1,130 @@
+#pragma once
+
+#include "core/config/ivalue.hh"
+
+#include "core/math/concepts.hh"
+
+namespace config
+{
+template<math::arithmetic T>
+class Number : public IValue {
+public:
+ explicit Number(T default_value = T(0));
+ explicit Number(T default_value, T min_value, T max_value);
+ virtual ~Number(void) = default;
+
+ virtual void set(std::string_view value) override;
+ virtual std::string_view get(void) const override;
+
+ T get_value(void) const;
+ void set_value(T value);
+
+ T get_min_value(void) const;
+ T get_max_value(void) const;
+ void set_limits(T min_value, T max_value);
+
+private:
+ T m_value;
+ T m_min_value;
+ T m_max_value;
+ std::string m_string;
+};
+} // namespace config
+
+namespace config
+{
+class Int final : public Number<int> {
+public:
+ using Number<int>::Number;
+};
+
+class Float final : public Number<float> {
+public:
+ using Number<float>::Number;
+};
+
+class Unsigned final : public Number<unsigned int> {
+public:
+ using Number<unsigned int>::Number;
+};
+
+class Unsigned64 final : public Number<std::uint64_t> {
+public:
+ using Number<std::uint64_t>::Number;
+};
+
+class SizeType final : public Number<std::size_t> {
+public:
+ using Number<std::size_t>::Number;
+};
+} // namespace config
+
+template<math::arithmetic T>
+inline config::Number<T>::Number(T default_value)
+{
+ m_value = default_value;
+ m_min_value = std::numeric_limits<T>::lowest();
+ m_max_value = std::numeric_limits<T>::max();
+ m_string = std::to_string(default_value);
+}
+
+template<math::arithmetic T>
+inline config::Number<T>::Number(T default_value, T min_value, T max_value)
+{
+ m_value = default_value;
+ m_min_value = min_value;
+ m_max_value = max_value;
+ m_string = std::to_string(default_value);
+}
+
+template<math::arithmetic T>
+inline void config::Number<T>::set(std::string_view value)
+{
+ T parsed_value;
+ auto result = std::from_chars(value.data(), value.data() + value.size(), parsed_value);
+
+ if(result.ec == std::errc()) {
+ m_value = std::clamp(parsed_value, m_min_value, m_max_value);
+ m_string = std::to_string(m_value);
+ }
+}
+
+template<math::arithmetic T>
+inline std::string_view config::Number<T>::get(void) const
+{
+ return m_string;
+}
+
+template<math::arithmetic T>
+inline T config::Number<T>::get_value(void) const
+{
+ return m_value;
+}
+
+template<math::arithmetic T>
+inline void config::Number<T>::set_value(T value)
+{
+ m_value = std::clamp(value, m_min_value, m_max_value);
+ m_string = std::to_string(m_value);
+}
+
+template<math::arithmetic T>
+inline T config::Number<T>::get_min_value(void) const
+{
+ return m_min_value;
+}
+
+template<math::arithmetic T>
+inline T config::Number<T>::get_max_value(void) const
+{
+ return m_max_value;
+}
+
+template<math::arithmetic T>
+inline void config::Number<T>::set_limits(T min_value, T max_value)
+{
+ m_min_value = min_value;
+ m_max_value = max_value;
+ m_value = std::clamp(m_value, m_min_value, m_max_value);
+ m_string = std::to_string(m_value);
+}
diff --git a/src/core/config/string.cc b/src/core/config/string.cc
new file mode 100644
index 0000000..198b448
--- /dev/null
+++ b/src/core/config/string.cc
@@ -0,0 +1,18 @@
+#include "core/pch.hh"
+
+#include "core/config/string.hh"
+
+config::String::String(std::string_view default_value)
+{
+ m_value = default_value;
+}
+
+void config::String::set(std::string_view value)
+{
+ m_value = value;
+}
+
+std::string_view config::String::get(void) const
+{
+ return m_value;
+}
diff --git a/src/core/config/string.hh b/src/core/config/string.hh
new file mode 100644
index 0000000..8fd3901
--- /dev/null
+++ b/src/core/config/string.hh
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "core/config/ivalue.hh"
+
+namespace config
+{
+class String : public IValue {
+public:
+ explicit String(std::string_view default_value);
+ virtual ~String(void) = default;
+
+ virtual void set(std::string_view value) override;
+ virtual std::string_view get(void) const override;
+
+ constexpr const std::string& get_value(void) const noexcept;
+ constexpr const char* c_str(void) const noexcept;
+
+private:
+ std::string m_value;
+};
+} // namespace config
+
+constexpr const std::string& config::String::get_value(void) const noexcept
+{
+ return m_value;
+}
+
+constexpr const char* config::String::c_str(void) const noexcept
+{
+ return m_value.c_str();
+}