Merge branch 'main' into feature/pointwisePolytrope

This commit is contained in:
2025-03-26 11:38:07 -04:00
2 changed files with 83 additions and 3 deletions

View File

@@ -23,15 +23,19 @@
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <algorithm>
#include <stdexcept>
#include <stdexcept>
// Required for YAML parsing
#include "yaml-cpp/yaml.h"
// -- Forward Def of Resource manager to let it act as a friend of Config --
class ResourceManager;
/**
* @class Config
* @brief Singleton class to manage configuration settings loaded from a YAML file.
@@ -96,6 +100,21 @@ private:
*/
void registerUnknownKey(const std::string &key);
bool m_loaded = false;
// Only friends can access get without a default value
template <typename T>
T get(const std::string &key) {
if (!m_loaded) {
throw std::runtime_error("Error! Config file not loaded");
}
if (has(key)) {
return getFromCache<T>(key, T());
} else {
throw std::runtime_error("Error! Key not found in config file");
}
}
public:
/**
* @brief Get the singleton instance of the Config class.
@@ -138,7 +157,7 @@ public:
*/
template <typename T>
T get(const std::string &key, T defaultValue) {
if (!loaded) {
if (!m_loaded) {
throw std::runtime_error("Configuration file not loaded! This should be done at the very start of whatever main function you are using (and only done once!)");
}
// --- Check if the key has already been checked for existence
@@ -176,6 +195,19 @@ public:
}
}
/**
* @brief Check if the key exists in the given config file
* @param key Key to check;
* @return boolean true or false
*/
bool has(const std::string &key);
/**
* @brief Get all keys defined in the configuration file.
* @return Vector of all keys in the configuration file.
*/
std::vector<std::string> keys() const;
/**
* @brief Print the configuration file path and the YAML root node.
* @param os Output stream.
@@ -183,6 +215,10 @@ public:
* @return Output stream.
*/
friend std::ostream& operator<<(std::ostream& os, const Config& config) {
if (!config.m_loaded) {
os << "Config file not loaded" << std::endl;
return os;
}
if (!config.debug) {
os << "Config file: " << config.configFilePath << std::endl;
} else{
@@ -195,6 +231,8 @@ public:
// Setup gTest class as a friend
friend class configTestPrivateAccessor;
// -- Resource Manager is a friend of config so it can create a seperate instance
friend class ResourceManager;
};
#endif