This commit is contained in:
Timur A. Fatkhullin 2024-04-08 17:37:15 +03:00
parent 580386459e
commit 9a12ff0c27
2 changed files with 71 additions and 6 deletions

View File

@ -77,12 +77,20 @@ static ValueT AdcFromChars(R&& range)
std::string s(rr.begin(), rr.end());
size_t pos;
if constexpr (std::is_same_v<v_t, float>) {
v = std::stof(s, &pos);
} else if constexpr (std::is_same_v<v_t, double>) {
v = std::stod(s, &pos);
} else if constexpr (std::is_same_v<v_t, long double>) {
v = std::stold(s, &pos);
try {
if constexpr (std::is_same_v<v_t, float>) {
v = std::stof(s, &pos);
} else if constexpr (std::is_same_v<v_t, double>) {
v = std::stod(s, &pos);
} else if constexpr (std::is_same_v<v_t, long double>) {
v = std::stold(s, &pos);
}
} catch (const std::invalid_argument&) {
throw std::invalid_argument(
"AdcFromChars: cannot convert char-range to user-type value (invalid argument)");
} catch (const std::out_of_range&) {
throw std::invalid_argument(
"AdcFromChars: cannot convert char-range to user-type value (result out of range)");
}
if (pos != s.size()) {
@ -274,4 +282,53 @@ static auto AdcCharRangeFromTuple(OutputR& res, const std::tuple<Ts...>& tp, Del
}
/*
*/
template <traits::adc_output_char_range SerializedT = std::string>
class AdcDefaultSerializer
{
std::string_view _delimiter;
public:
template <traits::adc_input_char_range DT = std::string_view>
AdcDefaultSerializer(const DT& delimiter = ",") : _delimiter(delimiter.begin(), delimiter.end())
{
}
AdcDefaultSerializer(const char* delimiter = ",") : _delimiter(delimiter) {}
virtual ~AdcDefaultSerializer() = default;
template <typename T>
SerializedT operator()(const T& value)
{
SerializedT res;
if constexpr (traits::adc_is_tuple_v<T>) {
AdcCharRangeFromTuple(res, value, _delimiter);
} else if constexpr (traits::adc_input_char_range<T>) {
AdcCharRangeFromValueRange(res, value, _delimiter);
} else {
res = AdcTrivialSerializer<SerializedT>(value);
}
return res;
}
template <traits::adc_input_char_range DT = std::string_view>
AdcDefaultSerializer& setDelimiter(const DT& delimiter)
{
_delimiter = std::string_view{delimiter.begin(), delimiter.end()};
return *this;
}
AdcDefaultSerializer& setDelimiter(const char* delimiter)
{
_delimiter = std::string_view{delimiter};
return *this;
}
};
} // namespace adc::utils

View File

@ -121,4 +121,12 @@ TEST_CASE("[ADC VALUEHOLDER]")
std::cout << ch;
}
std::cout << "\n";
ss = ";\t";
// adc::utils::AdcDefaultSerializer sr{"; "};
adc::utils::AdcDefaultSerializer sr{ss};
std::cout << "SR: " << sr(std::list<float>{11.11, 22.22, 33.33}) << "\n";
ss = ",\t";
std::cout << "SR: " << sr.setDelimiter(" , ")(std::vector<float>{11.11, 22.22, 33.33}) << "\n";
}