10 namespace qx::units::details
13 template<arithmetic_c T, enumeration_c unit_t>
24 template<arithmetic_c T, enumeration_c unit_t>
27 template<enumeration_c unit_t,
class char_t>
32 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
38 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
43 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
45 : m_From({ value, eFrom })
49 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
52 return units::details::unit_normalizer<T, unit_t>::normalize(unit);
55 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
61 template<qx::arithmetic_c T, qx::enumeration_c unit_t,
class char_t>
62 std::optional<qx::unit<T, unit_t>>
qx::unit_from_string(basic_string_view<char_t> svValue) noexcept
64 auto remove_suffix = [](basic_string_view<char_t> svValue,
65 auto predicate) -> std::optional<basic_string_view<char_t>>
67 size_t nToErase = predicate(svValue);
71 svValue.remove_suffix(nToErase);
75 auto trim_right = [&remove_suffix](basic_string_view<char_t> svValue)
77 while (std::optional<basic_string_view<char_t>> svErased = remove_suffix(
79 [](basic_string_view<char_t> svValue)
82 while (string_traits::traits<char_t>::is_space(svValue[nToErase]))
96 svValue = trim_right(svValue);
98 std::optional<unit_t> optUnitType;
99 auto optNewValue = remove_suffix(
101 [&optUnitType](basic_string_view<char_t> svValue) ->
size_t
103 const auto& suffixes = units::details::unit_suffixes<unit_t, char_t>::get();
104 const auto it = std::ranges::find_if(
106 [svValue](
const std::pair<unit_t, basic_string_view<char_t>>& suffix)
108 return svValue.ends_with(suffix.second);
111 if (it != suffixes.end())
113 optUnitType = it->first;
114 return it->second.size();
125 svValue = *optNewValue;
127 svValue = trim_right(svValue);
130 basic_string<char_t> sValue = svValue;
131 std::optional<T> optValue = sValue.template to<T>();
135 return unit(*optValue, *optUnitType);
139 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
140 template<
class format_parse_context_t>
141 constexpr
auto std::formatter<qx::unit<T, unit_t>, qx::char_type>::parse(format_parse_context_t& context) noexcept
143 return valueFormatter.parse(context);
147 template<qx::arithmetic_c T, qx::enumeration_c unit_t>
148 template<
class format_context_type_t>
149 constexpr
auto std::formatter<qx::unit<T, unit_t>, qx::char_type>::format(
151 format_context_type_t& ctx)
const noexcept
153 auto outIt = valueFormatter.format(unit.value, ctx);
154 return std::format_to(outIt, QX_TEXT(
"{}"), unit.type);
std::optional< unit< T, unit_t > > unit_from_string(basic_string_view< char_t > svValue) noexcept
Creates a unit from a string.
unit< T, unit_t > normalize_unit(unit< T, unit_t > unit) noexcept
The function returns the closest value greater than one from the SI for the unit of measurement.