summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/util/config/config.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/util/config/config.h')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/util/config/config.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/util/config/config.h b/src/libs/dxvk-native-1.9.2a/src/util/config/config.h
new file mode 100644
index 00000000..5951a27c
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/util/config/config.h
@@ -0,0 +1,152 @@
+#pragma once
+
+#include <string>
+#include <unordered_map>
+
+namespace dxvk {
+
+ /**
+ * \brief Tri-state
+ *
+ * Used to conditionally override
+ * booleans if desired.
+ */
+ enum class Tristate : int32_t {
+ Auto = -1,
+ False = 0,
+ True = 1,
+ };
+
+ /**
+ * \brief Config option set
+ *
+ * Stores configuration options
+ * as a set of key-value pairs.
+ */
+ class Config {
+ using OptionMap = std::unordered_map<std::string, std::string>;
+ public:
+
+ Config();
+ Config(OptionMap&& options);
+ ~Config();
+
+ /**
+ * \brief Merges two configuration sets
+ *
+ * Options specified in this config object will
+ * not be overridden if they are specified in
+ * the second config object.
+ * \param [in] other Config set to merge.
+ */
+ void merge(const Config& other);
+
+ /**
+ * \brief Sets an option
+ *
+ * \param [in] key Option name
+ * \param [in] value Option value
+ */
+ void setOption(
+ const std::string& key,
+ const std::string& value);
+
+ /**
+ * \brief Parses an option value
+ *
+ * Retrieves the option value as a string, and then
+ * tries to convert that string to the given type.
+ * If parsing the string fails because it is either
+ * invalid or if the option is not defined, this
+ * method will return a fallback value.
+ *
+ * Currently, this supports the types \c bool,
+ * \c int32_t, and \c std::string.
+ * \tparam T Return value type
+ * \param [in] option Option name
+ * \param [in] fallback Fallback value
+ * \returns Parsed option value
+ * \returns The parsed option value
+ */
+ template<typename T>
+ T getOption(const char* option, T fallback = T()) const {
+ const std::string& value = getOptionValue(option);
+
+ T result = fallback;
+ parseOptionValue(value, result);
+ return result;
+ }
+
+ /**
+ * \brief Logs option values
+ *
+ * Prints the effective configuration
+ * to the log for debugging purposes.
+ */
+ void logOptions() const;
+
+ /**
+ * \brief Retrieves default options for an app
+ *
+ * \param [in] appName Name of the application
+ * \returns Default options for the application
+ */
+ static Config getAppConfig(const std::string& appName);
+
+ /**
+ * \brief Retrieves user configuration
+ *
+ * Reads options from the configuration file,
+ * if it can be found, or an empty option set.
+ * \returns User-defined configuration options
+ */
+ static Config getUserConfig();
+
+ private:
+
+ OptionMap m_options;
+
+ std::string getOptionValue(
+ const char* option) const;
+
+ static bool parseOptionValue(
+ const std::string& value,
+ std::string& result);
+
+ static bool parseOptionValue(
+ const std::string& value,
+ bool& result);
+
+ static bool parseOptionValue(
+ const std::string& value,
+ int32_t& result);
+
+ static bool parseOptionValue(
+ const std::string& value,
+ Tristate& result);
+
+ template<typename I, typename V>
+ static bool parseStringOption(
+ std::string str,
+ I begin,
+ I end,
+ V& value);
+
+ };
+
+
+ /**
+ * \brief Applies tristate option
+ *
+ * Overrides the given value if \c state is
+ * \c True or \c False, and leaves it intact
+ * otherwise.
+ * \param [out] option The value to override
+ * \param [in] state Tristate to apply
+ */
+ inline void applyTristate(bool& option, Tristate state) {
+ option &= state != Tristate::False;
+ option |= state == Tristate::True;
+ }
+
+} \ No newline at end of file