#ifndef CONST_H #define CONST_H #include #include #include #include #include /** * @brief Structure to hold a constant's details. */ struct constant { std::string name; ///< Name of the constant double value; ///< Value of the constant double uncertainty; ///< Uncertainty in the constant's value std::string unit; ///< Unit of the constant std::string reference; ///< Reference for the constant's value }; /** * @brief Class to manage a collection of constants. */ class constants { private: bool loaded_ = false; ///< Flag to indicate if constants are loaded const int col_widths_[6] = {25, 52, 20, 20, 17, 45}; // From the python script used to generate the constants file std::map constants_; ///< Map to store constants by name /** * @brief Load constants from a file. * @param filename The name of the file to load constants from. * @return True if loading was successful, false otherwise. */ bool load(const std::string& filename); /** * @brief Trim leading and trailing whitespace from a string. * @param str The string to trim. * @return The trimmed string. */ std::string trim(const std::string& str); public: /** * @brief Default constructor. */ constants(); /** * @brief Constructor that initializes constants from a file. * @param filename The name of the file to load constants from. */ constants(const std::string& filename); /** * @brief Check if constants are loaded. * @return True if constants are loaded, false otherwise. */ bool is_loaded() { return loaded_; } /** * @brief Initialize constants from a file. * @param filename The name of the file to load constants from. * @return True if initialization was successful, false otherwise. */ bool initialize(const std::string& filename); /** * @brief Get a constant by key. * @param key The name of the constant to retrieve. * @return The constant associated with the given key. */ constant get(const std::string& key); /** * @brief Overloaded subscript operator to access constants by key. * @param key The name of the constant to retrieve. * @return The constant associated with the given key. * @throws std::out_of_range if the key is not found. */ constant operator[](const std::string& key) const; /** * @brief Check if a constant exists by key. * @param key The name of the constant to check. * @return True if the constant exists, false otherwise. */ bool has(const std::string& key) const; /** * @brief Get a list of all constant keys. * @return A vector of all constant keys. */ std::set keys() const; }; #endif