From 05fac66e79c3ccb3b1bb665f5e3cc1d5c8730bec Mon Sep 17 00:00:00 2001 From: Liam Teale Date: Tue, 7 Jan 2025 16:38:52 -0800 Subject: [PATCH] add std::format support for unnamed types --- include/units/units.hpp | 43 +++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 2 ++ 2 files changed, 45 insertions(+) diff --git a/include/units/units.hpp b/include/units/units.hpp index f34cddb..16fa5b0 100644 --- a/include/units/units.hpp +++ b/include/units/units.hpp @@ -184,6 +184,49 @@ template using Rooted = Named< std::ratio_divide, std::ratio_divide, std::ratio_divide, std::ratio_divide>>; +template + requires(!std::is_same_v, Q>) +struct std::formatter : std::formatter { + auto format(const Q& quantity, std::format_context& ctx) const { + // return std::format_to(ctx.out(), "{}", quantity.internal()); + return std::formatter>::format(quantity, ctx); + } +}; + +template + requires std::is_same_v, Q> +struct std::formatter : std::formatter { + auto format(const Q& quantity, std::format_context& ctx) const { + constinit static std::array, 8> dims {{ + {Q::mass::num, Q::mass::den}, + {Q::length::num, Q::length::den}, + {Q::time::num, Q::time::den}, + {Q::current::num, Q::current::den}, + {Q::angle::num, Q::angle::den}, + {Q::temperature::num, Q::temperature::den}, + {Q::luminosity::num, Q::luminosity::den}, + {Q::moles::num, Q::moles::den}, + }}; + std::array prefixes {"_kg", "_m", "_s", "_A", "_rad", "_K", "_cd", "_mol"}; + + auto out = ctx.out(); + + // Format the quantity value + out = std::formatter::format(quantity.internal(), ctx); + + // Add dimensions and prefixes + for (size_t i = 0; i != 8; i++) { + if (dims[i].first != 0) { + out = std::format_to(out, "{}", prefixes[i]); + if (dims[i].first != 1 || dims[i].second != 1) { out = std::format_to(out, "^{}", dims[i].first); } + if (dims[i].second != 1) { out = std::format_to(out, "/{}", dims[i].second); } + } + } + + return out; + } +}; + inline void unit_printer_helper(std::ostream& os, double quantity, const std::array, 8>& dims) { static constinit std::array prefixes {"_kg", "_m", "_s", "_A", "_rad", "_K", "_cd", "_mol"}; diff --git a/src/main.cpp b/src/main.cpp index 31bbafd..fddaa4f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,8 @@ void initialize() { std::cout << std::format("{:.2f}", 180_stDeg) << std::endl; // should output 3.14_stRad std::cout << std::format("{:.2f}", 0_celsius) << std::endl; // should output 273.15 std::cout << std::format("{:.2f}", 1.2345) << std::endl; + std::cout << units::pow<5>(505_cm) * 15_celsius << std::endl; + std::cout << std::format("{:.2f}", units::pow<5>(505_cm) * 15_celsius) << std::endl; } constexpr void miscTests() {