16#ifndef OPENSWMM_ENGINE_INPUT_PARSE_UTILS_HPP
17#define OPENSWMM_ENGINE_INPUT_PARSE_UTILS_HPP
22#include "../core/charconv_compat.hpp"
23#include "../core/DateTime.hpp"
34inline double to_double(std::string_view sv,
double def = 0.0) noexcept {
43inline int to_int(std::string_view sv,
int def = 0) noexcept {
45 auto [ptr, ec] = std::from_chars(sv.data(), sv.data() + sv.size(), v);
46 if (ec != std::errc{})
return def;
58 unsigned m = 0, d = 0,
y = 0;
59 const char* p = sv.data();
60 const char* end = sv.data() + sv.size();
62 auto read_uint = [&](
unsigned& out) ->
bool {
63 auto [np, ec] = std::from_chars(p, end, out);
64 if (ec != std::errc{})
return false;
69 if (!read_uint(m))
return 0.0;
70 if (p < end && *p ==
'/') ++p;
else return 0.0;
71 if (!read_uint(d))
return 0.0;
72 if (p < end && *p ==
'/') ++p;
else return 0.0;
73 if (!read_uint(
y))
return 0.0;
92 if (ec == std::errc{} && ptr == sv.data() + sv.size()) {
97 unsigned h = 0, m = 0;
99 const char* p = sv.data();
100 const char* end = sv.data() + sv.size();
102 auto read_uint = [&](
unsigned& out) ->
bool {
103 auto [np, nec] = std::from_chars(p, end, out);
104 if (nec != std::errc{})
return false;
109 if (!read_uint(h))
return 0.0;
110 if (p < end && *p ==
':') {
112 if (!read_uint(m))
return static_cast<double>(h);
113 if (p < end && *p ==
':') {
118 return h * 3600.0 + m * 60.0 + s;
127 unsigned h = 0, m = 0, s = 0;
128 const char* p = sv.data();
129 const char* end = sv.data() + sv.size();
131 auto read_uint = [&](
unsigned& out) ->
bool {
132 auto [np, ec] = std::from_chars(p, end, out);
133 if (ec != std::errc{})
return false;
138 if (!read_uint(h))
return 0.0;
139 if (p < end && *p ==
':') ++p;
141 if (p < end && *p ==
':') ++p;
146 static_cast<int>(s));
156inline double parse_datetime(std::string_view date_sv, std::string_view time_sv) {
DateTime encodeTime(int hour, int minute, int second)
Encode hour:minute:second to fractional day.
Definition DateTime.hpp:94
DateTime encodeDate(int year, int month, int day)
Encode year-month-day to DateTime.
Definition DateTime.hpp:76
std::from_chars_result from_chars_double(const char *first, const char *last, double &value) noexcept
Locale-independent parse of a double from a character range.
Definition charconv_compat.hpp:29
double * y
Definition odesolve.c:28