diff --git a/src/core/include/mp-units/unit.h b/src/core/include/mp-units/unit.h index 54a9e609..58a614cf 100644 --- a/src/core/include/mp-units/unit.h +++ b/src/core/include/mp-units/unit.h @@ -809,12 +809,36 @@ constexpr Out unit_symbol_to(Out out, U u, unit_symbol_formatting fmt = unit_sym return detail::unit_symbol_impl(out, u, fmt, false); } -template -[[nodiscard]] constexpr std::basic_string unit_symbol(U u, unit_symbol_formatting fmt = unit_symbol_formatting{}) +namespace detail { + +template +[[nodiscard]] consteval std::array get_symbol_buffer(U) { - std::basic_string buffer; - unit_symbol_to(std::back_inserter(buffer), u, fmt); + std::array buffer{}; + unit_symbol_to(buffer.begin(), U{}, fmt); return buffer; } +} // namespace detail + +template +[[nodiscard]] constexpr auto unit_symbol(U) +{ + auto get_size = []() consteval { + std::basic_string buffer; + unit_symbol_to(std::back_inserter(buffer), U{}, fmt); + return buffer.size(); + }; + +#if __cpp_constexpr >= 202211L // Permitting static constexpr variables in constexpr functions + static constexpr std::size_t size = get_size(); + static constexpr auto buffer = detail::get_symbol_buffer(U{}); + return std::string_view(buffer.data(), size); +#else + constexpr std::size_t size = get_size(); + constexpr auto buffer = detail::get_symbol_buffer(U{}); + return basic_fixed_string(buffer.data(), std::integral_constant{}); +#endif +} + } // namespace mp_units