#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 overload the << operator for pretty printing */ friend std::ostream& operator<<(std::ostream& os, const constant& c) { os << "<" << c.name << ": "; os << c.value << "±" << c.uncertainty << " "; os << c.unit << " (" << c.reference << ")>\n"; return os; } }; /** * @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