37#ifndef __SDDSPARSER_H__
38#define __SDDSPARSER_H__
47 std::string retval(for_string);
63 void setInput(
const std::string& input);
83 void getValue(
int t, std::string column_name,
T& nval) {
91 if (t <= 0 ||
static_cast<size_t>(t) > num_rows)
92 row_idx = num_rows - 1;
94 row_idx =
static_cast<size_t>(t) - 1;
97 nval = getBoostVariantValue<T>(val, (
int)
getColumnType(column_name));
109 template <
typename T>
111 std::string ref_name,
double ref_val, std::string col_name,
T& nval) {
114 double value_before_ref = 0;
115 double value_after_ref = 0;
123 size_t num_rows = ref_values.size();
125 for (this_row = 0; this_row < num_rows; this_row++) {
126 value_after_ref = std::get<double>(ref_values[this_row]);
128 if (ref_val < value_after_ref) {
130 if (this_row > 0) prev_row = this_row - 1;
132 value_before = getBoostVariantValue<T>(col_values[prev_row], datatype);
133 value_after = getBoostVariantValue<T>(col_values[this_row], datatype);
135 value_before_ref = std::get<double>(ref_values[prev_row]);
136 value_after_ref = std::get<double>(ref_values[this_row]);
142 if (this_row == num_rows)
144 "SDDSParser::getInterpolatedValue",
145 "all values < specified reference value");
148 if (ref_val - value_before_ref < 1e-8)
152 + (ref_val - value_before_ref) * (value_after - value_before)
153 / (value_after_ref - value_before_ref);
156 double dval =
static_cast<double>(nval);
157 if (dval != dval || (dval == dval * 2.0 && dval != 0.0))
159 "SDDSParser::getInterpolatedValue",
160 "Interpolated value either NaN or Inf.");
171 template <
typename T>
183 template <
typename T>
190 nval = std::get<T>(value);
193 "SDDSParser::getParameterValue",
194 "unknown parameter name: '" + parameter_name +
"'!");
201 template <
typename T>
207 value = std::get<float>(val);
210 value = std::get<double>(val);
213 value = std::get<short>(val);
216 value = std::get<long>(val);
220 "SDDSParser::getBoostVariantValue",
221 "can't convert value to type T");
225 "SDDSParser::getBoostVariantValue",
"can't convert value");
std::map< std::string, int > columnNameToID_m
mapping from column name to ID in columns_m
void getParameterValue(std::string parameter_name, T &nval)
ast::columnData_t getColumnData(const std::string &columnName)
ast::datatype getColumnType(const std::string &col_name)
std::string sddsFileName_m
T getBoostVariantValue(const ast::variant_t &val, int datatype) const
Convert value from std::variant (only numeric types) to a value of type T.
void getInterpolatedValue(std::string ref_name, double ref_val, std::string col_name, T &nval)
static void fixCaseSensitivity(std::string &for_string)
void setInput(const std::string &input)
void getValue(int t, std::string column_name, T &nval)
static std::string fixCaseSensitivity(const std::string &for_string)
void getInterpolatedValue(double spos, std::string col_name, T &nval)
int getColumnIndex(std::string col_name) const
std::map< std::string, int > paramNameToID_m
mapping from parameter name to offset in params_m
std::vector< variant_t > columnData_t
std::variant< float, double, short, long, char, std::string > variant_t
parameterList sddsParameters_m