#include #include #include #include #include #include #include "const.h" constants::constants() { loaded_ = false; } constants::constants(const std::string& filename) { loaded_ = initialize(filename); } bool constants::initialize(const std::string& filename) { return load(filename); } constant constants::get(const std::string& name) { return constants_[name]; } constant constants::operator[](const std::string& name) const { auto it = constants_.find(name); if (it != constants_.end()) { return it->second; } else { throw std::out_of_range("Constant '" + name + "' not found."); } } bool constants::has(const std::string& name) const { return constants_.find(name) != constants_.end(); } std::set constants::keys() const { std::set keys; for (const auto& pair : constants_) { keys.insert(pair.first); } return keys; } std::string constants::trim(const std::string& str) { size_t first = str.find_first_not_of(" \t"); if (first == std::string::npos) return ""; size_t last = str.find_last_not_of(" \t"); return str.substr(first, last - first + 1); } bool constants::load(const std::string& filename) { std::ifstream file(filename); std::map constants_temp; if (!file.is_open()) { std::cerr << "Error: Unable to open file " << filename << std::endl; return false; } std::string line; bool data_section = false; int line_count = 0; while (std::getline(file, line)) { line_count++; // Detect start of data section (double divider line) if (!data_section) { if (line.find("Symbol") != std::string::npos) { // Find header row std::getline(file, line); // Skip dashed divider std::getline(file, line); // Skip second dashed divider data_section = true; } continue; } // Ensure the line is long enough to contain all fields if (line.length() < 125) continue; // Define exact column widths from Python script int start = 0; std::string symbol = trim(line.substr(start, col_widths_[0])); start += col_widths_[0]; std::string name = trim(line.substr(start, col_widths_[1])); start += col_widths_[1]; std::string valueStr = line.substr(start, col_widths_[2]); start += col_widths_[2]; std::string unit = trim(line.substr(start, col_widths_[3])); start += col_widths_[3]; // Only trim the unit std::string uncertaintyStr = line.substr(start, col_widths_[4]); start += col_widths_[4]; std::string reference = trim(line.substr(start, col_widths_[5])); // Only trim reference // Convert numerical fields safely double value = 0.0, uncertainty = 0.0; try { value = std::stod(valueStr); } catch (...) { std::cerr << "Warning: Invalid value in line " << line_count << ": " << valueStr << std::endl; } try { uncertainty = std::stod(uncertaintyStr); } catch (...) { std::cerr << "Warning: Invalid uncertainty in line " << line_count << ": " << uncertaintyStr << std::endl; } // Store in map constants_temp[symbol] = {name, value, uncertainty, unit, reference}; } file.close(); constants_ = constants_temp; loaded_ = true; return true; }