feat(const): added constants class
constants class can parse and get physical constants from datafile including value, unit, uncertainity, and reference
This commit is contained in:
112
src/const/private/const.cpp
Normal file
112
src/const/private/const.cpp
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <set>
|
||||
|
||||
#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<std::string> constants::keys() const {
|
||||
std::set<std::string> 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<std::string, constant> 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 = 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;
|
||||
}
|
||||
Reference in New Issue
Block a user