5#include <range/v3/view.hpp>
13 auto split_string_view(std::string_view str, std::string_view del) -> std::vector<std::string_view>
15 auto splits = std::vector<std::string_view>{};
17 for (
auto sub_begin = str.find_first_not_of(del); sub_begin != std::string_view::npos;
18 sub_begin = str.find_first_not_of(del, sub_begin))
20 auto sub_end = str.find_first_of(del, sub_begin);
21 sub_end = (sub_end == std::string_view::npos) ? str.size() : sub_end;
22 auto sub_str = str.substr(sub_begin, sub_end - sub_begin);
23 splits.push_back(sub_str);
29 auto parse_parameter(std::string_view line_string) -> std::optional<ParResultEntry>
31 auto splits_view = split_string_view(line_string,
" ");
32 auto result = ParResultEntry{};
34 constexpr auto max_size = 5;
35 constexpr auto min_size = 3;
36 if (splits_view.size() >= min_size)
38 result.par_num = std::stoi(std::string{ splits_view.front() });
39 result.value = std::stof(std::string{ splits_view[1] });
40 result.sigma = std::stof(std::string{ splits_view[2] });
47 if (splits_view.size() == max_size)
49 result.value_diff = std::stof(std::string{ splits_view[3] });
50 result.error = std::stof(std::string{ splits_view.back() });
52 else if (splits_view.size() != min_size)
68 auto ifile = std::ifstream(filename_, std::ios_base::in);
69 auto buffer = std::string{};
72 std::getline(ifile, buffer);
73 while (std::getline(ifile, buffer))
75 auto result = parse_parameter(buffer);
76 if (result.has_value())
78 par_results_.emplace(result->par_num, result.value());
83 void ResultReader::print() { fmt::print(
"{}\n", fmt::join(par_results_ | rng::views::values,
"\n")); }