From fc31ef2e7cd440dfb3e0772c4440f360e884d016 Mon Sep 17 00:00:00 2001 From: VPRamon Date: Thu, 26 Feb 2026 14:54:19 +0100 Subject: [PATCH 1/2] Refactor unit traits in mass, power, and time headers; add comprehensive formatting tests - Removed redundant comments and improved formatting consistency in `mass.hpp`, `power.hpp`, and `time.hpp`. - Updated `UnitTraits` specializations to follow a consistent style. - Introduced a new test file `test_formatting.cpp` to validate quantity string formatting, covering various scenarios including default, fixed, and scientific formats. - Ensured that formatting tests mirror Rust's formatting capabilities, enhancing the robustness of the quantity representation. --- CMakeLists.txt | 1 + include/qtty/ffi_core.hpp | 117 ++++++- include/qtty/literals.hpp | 595 ++++++++++++++++----------------- include/qtty/units/angular.hpp | 63 ++-- include/qtty/units/length.hpp | 416 +++++++++++------------ include/qtty/units/mass.hpp | 189 ++++++----- include/qtty/units/power.hpp | 147 ++++---- include/qtty/units/time.hpp | 177 +++++----- qtty | 2 +- tests/test_formatting.cpp | 190 +++++++++++ 10 files changed, 1086 insertions(+), 811 deletions(-) create mode 100644 tests/test_formatting.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5192fd7..ceee264 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,7 @@ set(TEST_FFI_SOURCES tests/test_dimension_safety.cpp tests/test_precision.cpp tests/test_serialization.cpp + tests/test_formatting.cpp ) add_executable(test_ffi ${TEST_FFI_SOURCES}) diff --git a/include/qtty/ffi_core.hpp b/include/qtty/ffi_core.hpp index ba364e4..dfefd44 100644 --- a/include/qtty/ffi_core.hpp +++ b/include/qtty/ffi_core.hpp @@ -9,7 +9,9 @@ */ #include +#include #include +#include #include #include #include @@ -278,12 +280,79 @@ template class Quantity { Quantity operator-() const { return Quantity(-m_value); } Quantity abs() const { return Quantity(std::abs(m_value)); } + + // ======================================================================== + // String Formatting + // ======================================================================== + // Format the quantity as a human-readable string, mirroring Rust's format + // annotations. The mapping is: + // + // Rust C++ + // {} format() + // {:.2} format(2) + // {:e} format(-1, QTTY_FMT_LOWER_EXP) + // {:.4e} format(4, QTTY_FMT_LOWER_EXP) + // {:E} format(-1, QTTY_FMT_UPPER_EXP) + // {:.4E} format(4, QTTY_FMT_UPPER_EXP) + // + // The formatting logic lives in the Rust qtty-ffi library, so precision + // semantics are identical on both sides of the FFI boundary. + + /** + * @brief Format this quantity as a string. + * + * Delegates to the Rust qtty-ffi `qtty_quantity_format` function so that + * C++ and Rust produce identical output for the same parameters. + * + * @param precision Digits after the decimal point. Pass a negative value + * (default) for the shortest exact representation. + * @param flags Notation selector: + * - `QTTY_FMT_DEFAULT` (0): decimal (e.g. `"1234.57 m"`) + * - `QTTY_FMT_LOWER_EXP` (1): scientific lower-case `e` + * - `QTTY_FMT_UPPER_EXP` (2): scientific upper-case `E` + * @return Formatted string, e.g. `"1234.57 m"` or `"1.23e3 m"`. + * @throws QttyException on formatting failure. + */ + std::string format(int precision = -1, + uint32_t flags = QTTY_FMT_DEFAULT) const { + qtty_quantity_t qty; + int32_t make_status = qtty_quantity_make(m_value, unit_id(), &qty); + check_status(make_status, "format: creating quantity"); + + char buf[512]; + int32_t result = + qtty_quantity_format(qty, precision, flags, buf, sizeof(buf)); + if (result == QTTY_ERR_BUFFER_TOO_SMALL) { + // Retry with a generous large buffer (quantities should never need this) + char big_buf[4096]; + result = qtty_quantity_format(qty, precision, flags, big_buf, + sizeof(big_buf)); + if (result < 0) { + throw QttyException("format: buffer too small even at 4096 bytes"); + } + return std::string(big_buf); + } + if (result < 0) { + check_status(result, "format: formatting quantity"); + } + return std::string(buf); + } }; // ============================================================================ // Stream Insertion Operator // ============================================================================ -// Prints a quantity with its unit symbol, e.g., "1500 m" or "42.5 km" +// Prints a quantity with its unit symbol, e.g., "1500 m" or "42.5 km". +// +// Because this streams `q.value()` (a plain double) directly into the +// `std::ostream`, all standard stream format manipulators are respected: +// +// std::cout << std::fixed << std::setprecision(2) << qty; // "1234.57 m" +// std::cout << std::scientific << qty; // "1.23457e+003 m" +// std::cout << std::scientific << std::setprecision(4) +// << qty; // "1.2346e+003 m" +// +// For `std::format` (C++20) see the std::formatter specialisation below. template std::ostream &operator<<(std::ostream &os, const Quantity &q) { @@ -292,3 +361,49 @@ std::ostream &operator<<(std::ostream &os, const Quantity &q) { } } // namespace qtty + +// ============================================================================ +// C++20 std::formatter specialisation +// ============================================================================ +// Allows `std::format` and `std::print` to be used with any Quantity type, +// honouring the same format specifiers as std::formatter: +// +// std::format("{}", qty) → "1234.56789 s" +// std::format("{:.2f}", qty) → "1234.57 s" +// std::format("{:e}", qty) → "1.23457e+03 s" +// std::format("{:.4e}", qty) → "1.2346e+03 s" +// std::format("{:E}", qty) → "1.23457E+03 s" +// std::format("{:>15.2f}", qty) → " 1234.57 s" (number padded, not symbol) +// +// Note: width / fill / align specifications are applied to the numeric part +// only; the unit symbol is always appended directly after without padding. +// This mirrors the behaviour of the Rust Display/LowerExp/UpperExp impls. + +#if __cplusplus >= 202002L +#include + +namespace std { + +template +struct formatter> { +private: + std::formatter double_fmt_; + +public: + /// Parse the format specification (e.g. ".2f", "e", ".4e"). + template + constexpr auto parse(ParseContext &ctx) { + return double_fmt_.parse(ctx); + } + + /// Format the quantity: apply the parsed spec to the value, then append the + /// unit symbol. + template + auto format(const qtty::Quantity &qty, FormatContext &ctx) const { + auto out = double_fmt_.format(qty.value(), ctx); + return std::format_to(out, " {}", qtty::UnitTraits::symbol()); + } +}; + +} // namespace std +#endif // __cplusplus >= 202002L diff --git a/include/qtty/literals.hpp b/include/qtty/literals.hpp index de3dbb4..7d88c60 100644 --- a/include/qtty/literals.hpp +++ b/include/qtty/literals.hpp @@ -1,13 +1,10 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once -#include "units/angular.hpp" #include "units/length.hpp" +#include "units/time.hpp" +#include "units/angular.hpp" #include "units/mass.hpp" #include "units/power.hpp" -#include "units/time.hpp" namespace qtty { @@ -18,1019 +15,1019 @@ inline namespace literals { // Length literals // ==================== + constexpr PlanckLength operator""_l_P(long double value) { - return PlanckLength(static_cast(value)); + return PlanckLength(static_cast(value)); } constexpr PlanckLength operator""_l_P(unsigned long long value) { - return PlanckLength(static_cast(value)); + return PlanckLength(static_cast(value)); } constexpr Yoctometer operator""_ym(long double value) { - return Yoctometer(static_cast(value)); + return Yoctometer(static_cast(value)); } constexpr Yoctometer operator""_ym(unsigned long long value) { - return Yoctometer(static_cast(value)); + return Yoctometer(static_cast(value)); } constexpr Zeptometer operator""_zm(long double value) { - return Zeptometer(static_cast(value)); + return Zeptometer(static_cast(value)); } constexpr Zeptometer operator""_zm(unsigned long long value) { - return Zeptometer(static_cast(value)); + return Zeptometer(static_cast(value)); } constexpr Attometer operator""_am(long double value) { - return Attometer(static_cast(value)); + return Attometer(static_cast(value)); } constexpr Attometer operator""_am(unsigned long long value) { - return Attometer(static_cast(value)); + return Attometer(static_cast(value)); } constexpr Femtometer operator""_fm(long double value) { - return Femtometer(static_cast(value)); + return Femtometer(static_cast(value)); } constexpr Femtometer operator""_fm(unsigned long long value) { - return Femtometer(static_cast(value)); + return Femtometer(static_cast(value)); } constexpr Picometer operator""_pm(long double value) { - return Picometer(static_cast(value)); + return Picometer(static_cast(value)); } constexpr Picometer operator""_pm(unsigned long long value) { - return Picometer(static_cast(value)); + return Picometer(static_cast(value)); } constexpr Nanometer operator""_nm(long double value) { - return Nanometer(static_cast(value)); + return Nanometer(static_cast(value)); } constexpr Nanometer operator""_nm(unsigned long long value) { - return Nanometer(static_cast(value)); + return Nanometer(static_cast(value)); } constexpr Micrometer operator""_um(long double value) { - return Micrometer(static_cast(value)); + return Micrometer(static_cast(value)); } constexpr Micrometer operator""_um(unsigned long long value) { - return Micrometer(static_cast(value)); + return Micrometer(static_cast(value)); } constexpr Millimeter operator""_mm(long double value) { - return Millimeter(static_cast(value)); + return Millimeter(static_cast(value)); } constexpr Millimeter operator""_mm(unsigned long long value) { - return Millimeter(static_cast(value)); + return Millimeter(static_cast(value)); } constexpr Centimeter operator""_cm(long double value) { - return Centimeter(static_cast(value)); + return Centimeter(static_cast(value)); } constexpr Centimeter operator""_cm(unsigned long long value) { - return Centimeter(static_cast(value)); + return Centimeter(static_cast(value)); } constexpr Decimeter operator""_dm(long double value) { - return Decimeter(static_cast(value)); + return Decimeter(static_cast(value)); } constexpr Decimeter operator""_dm(unsigned long long value) { - return Decimeter(static_cast(value)); + return Decimeter(static_cast(value)); } constexpr Meter operator""_m(long double value) { - return Meter(static_cast(value)); + return Meter(static_cast(value)); } constexpr Meter operator""_m(unsigned long long value) { - return Meter(static_cast(value)); + return Meter(static_cast(value)); } constexpr Decameter operator""_dam(long double value) { - return Decameter(static_cast(value)); + return Decameter(static_cast(value)); } constexpr Decameter operator""_dam(unsigned long long value) { - return Decameter(static_cast(value)); + return Decameter(static_cast(value)); } constexpr Hectometer operator""_hm(long double value) { - return Hectometer(static_cast(value)); + return Hectometer(static_cast(value)); } constexpr Hectometer operator""_hm(unsigned long long value) { - return Hectometer(static_cast(value)); + return Hectometer(static_cast(value)); } constexpr Kilometer operator""_km(long double value) { - return Kilometer(static_cast(value)); + return Kilometer(static_cast(value)); } constexpr Kilometer operator""_km(unsigned long long value) { - return Kilometer(static_cast(value)); + return Kilometer(static_cast(value)); } constexpr Megameter operator""_Mm(long double value) { - return Megameter(static_cast(value)); + return Megameter(static_cast(value)); } constexpr Megameter operator""_Mm(unsigned long long value) { - return Megameter(static_cast(value)); + return Megameter(static_cast(value)); } constexpr Gigameter operator""_Gm(long double value) { - return Gigameter(static_cast(value)); + return Gigameter(static_cast(value)); } constexpr Gigameter operator""_Gm(unsigned long long value) { - return Gigameter(static_cast(value)); + return Gigameter(static_cast(value)); } constexpr Terameter operator""_Tm(long double value) { - return Terameter(static_cast(value)); + return Terameter(static_cast(value)); } constexpr Terameter operator""_Tm(unsigned long long value) { - return Terameter(static_cast(value)); + return Terameter(static_cast(value)); } constexpr Petameter operator""_Pm(long double value) { - return Petameter(static_cast(value)); + return Petameter(static_cast(value)); } constexpr Petameter operator""_Pm(unsigned long long value) { - return Petameter(static_cast(value)); + return Petameter(static_cast(value)); } constexpr Exameter operator""_Em(long double value) { - return Exameter(static_cast(value)); + return Exameter(static_cast(value)); } constexpr Exameter operator""_Em(unsigned long long value) { - return Exameter(static_cast(value)); + return Exameter(static_cast(value)); } constexpr Zettameter operator""_Zm(long double value) { - return Zettameter(static_cast(value)); + return Zettameter(static_cast(value)); } constexpr Zettameter operator""_Zm(unsigned long long value) { - return Zettameter(static_cast(value)); + return Zettameter(static_cast(value)); } constexpr Yottameter operator""_Ym(long double value) { - return Yottameter(static_cast(value)); + return Yottameter(static_cast(value)); } constexpr Yottameter operator""_Ym(unsigned long long value) { - return Yottameter(static_cast(value)); + return Yottameter(static_cast(value)); } constexpr BohrRadius operator""_a(long double value) { - return BohrRadius(static_cast(value)); + return BohrRadius(static_cast(value)); } constexpr BohrRadius operator""_a(unsigned long long value) { - return BohrRadius(static_cast(value)); + return BohrRadius(static_cast(value)); } constexpr ClassicalElectronRadius operator""_r_e(long double value) { - return ClassicalElectronRadius(static_cast(value)); + return ClassicalElectronRadius(static_cast(value)); } constexpr ClassicalElectronRadius operator""_r_e(unsigned long long value) { - return ClassicalElectronRadius(static_cast(value)); + return ClassicalElectronRadius(static_cast(value)); } constexpr ElectronReducedComptonWavelength operator""__e(long double value) { - return ElectronReducedComptonWavelength(static_cast(value)); + return ElectronReducedComptonWavelength(static_cast(value)); } -constexpr ElectronReducedComptonWavelength -operator""__e(unsigned long long value) { - return ElectronReducedComptonWavelength(static_cast(value)); +constexpr ElectronReducedComptonWavelength operator""__e(unsigned long long value) { + return ElectronReducedComptonWavelength(static_cast(value)); } constexpr AstronomicalUnit operator""_au(long double value) { - return AstronomicalUnit(static_cast(value)); + return AstronomicalUnit(static_cast(value)); } constexpr AstronomicalUnit operator""_au(unsigned long long value) { - return AstronomicalUnit(static_cast(value)); + return AstronomicalUnit(static_cast(value)); } constexpr LightYear operator""_ly(long double value) { - return LightYear(static_cast(value)); + return LightYear(static_cast(value)); } constexpr LightYear operator""_ly(unsigned long long value) { - return LightYear(static_cast(value)); + return LightYear(static_cast(value)); } constexpr Parsec operator""_pc(long double value) { - return Parsec(static_cast(value)); + return Parsec(static_cast(value)); } constexpr Parsec operator""_pc(unsigned long long value) { - return Parsec(static_cast(value)); + return Parsec(static_cast(value)); } constexpr Kiloparsec operator""_kpc(long double value) { - return Kiloparsec(static_cast(value)); + return Kiloparsec(static_cast(value)); } constexpr Kiloparsec operator""_kpc(unsigned long long value) { - return Kiloparsec(static_cast(value)); + return Kiloparsec(static_cast(value)); } constexpr Megaparsec operator""_Mpc(long double value) { - return Megaparsec(static_cast(value)); + return Megaparsec(static_cast(value)); } constexpr Megaparsec operator""_Mpc(unsigned long long value) { - return Megaparsec(static_cast(value)); + return Megaparsec(static_cast(value)); } constexpr Gigaparsec operator""_Gpc(long double value) { - return Gigaparsec(static_cast(value)); + return Gigaparsec(static_cast(value)); } constexpr Gigaparsec operator""_Gpc(unsigned long long value) { - return Gigaparsec(static_cast(value)); + return Gigaparsec(static_cast(value)); } constexpr Inch operator""_in(long double value) { - return Inch(static_cast(value)); + return Inch(static_cast(value)); } constexpr Inch operator""_in(unsigned long long value) { - return Inch(static_cast(value)); + return Inch(static_cast(value)); } constexpr Foot operator""_ft(long double value) { - return Foot(static_cast(value)); + return Foot(static_cast(value)); } constexpr Foot operator""_ft(unsigned long long value) { - return Foot(static_cast(value)); + return Foot(static_cast(value)); } constexpr Yard operator""_yd(long double value) { - return Yard(static_cast(value)); + return Yard(static_cast(value)); } constexpr Yard operator""_yd(unsigned long long value) { - return Yard(static_cast(value)); + return Yard(static_cast(value)); } constexpr Mile operator""_mi(long double value) { - return Mile(static_cast(value)); + return Mile(static_cast(value)); } constexpr Mile operator""_mi(unsigned long long value) { - return Mile(static_cast(value)); + return Mile(static_cast(value)); } constexpr Link operator""_lk(long double value) { - return Link(static_cast(value)); + return Link(static_cast(value)); } constexpr Link operator""_lk(unsigned long long value) { - return Link(static_cast(value)); + return Link(static_cast(value)); } constexpr Fathom operator""_ftm(long double value) { - return Fathom(static_cast(value)); + return Fathom(static_cast(value)); } constexpr Fathom operator""_ftm(unsigned long long value) { - return Fathom(static_cast(value)); + return Fathom(static_cast(value)); } constexpr Rod operator""_rd(long double value) { - return Rod(static_cast(value)); + return Rod(static_cast(value)); } constexpr Rod operator""_rd(unsigned long long value) { - return Rod(static_cast(value)); + return Rod(static_cast(value)); } constexpr Chain operator""_ch(long double value) { - return Chain(static_cast(value)); + return Chain(static_cast(value)); } constexpr Chain operator""_ch(unsigned long long value) { - return Chain(static_cast(value)); + return Chain(static_cast(value)); } constexpr NauticalMile operator""_nmi(long double value) { - return NauticalMile(static_cast(value)); + return NauticalMile(static_cast(value)); } constexpr NauticalMile operator""_nmi(unsigned long long value) { - return NauticalMile(static_cast(value)); + return NauticalMile(static_cast(value)); } constexpr NominalLunarRadius operator""_R_moon(long double value) { - return NominalLunarRadius(static_cast(value)); + return NominalLunarRadius(static_cast(value)); } constexpr NominalLunarRadius operator""_R_moon(unsigned long long value) { - return NominalLunarRadius(static_cast(value)); + return NominalLunarRadius(static_cast(value)); } constexpr NominalLunarDistance operator""_LD(long double value) { - return NominalLunarDistance(static_cast(value)); + return NominalLunarDistance(static_cast(value)); } constexpr NominalLunarDistance operator""_LD(unsigned long long value) { - return NominalLunarDistance(static_cast(value)); + return NominalLunarDistance(static_cast(value)); } constexpr NominalEarthPolarRadius operator""_R_earthpol(long double value) { - return NominalEarthPolarRadius(static_cast(value)); + return NominalEarthPolarRadius(static_cast(value)); } -constexpr NominalEarthPolarRadius -operator""_R_earthpol(unsigned long long value) { - return NominalEarthPolarRadius(static_cast(value)); +constexpr NominalEarthPolarRadius operator""_R_earthpol(unsigned long long value) { + return NominalEarthPolarRadius(static_cast(value)); } constexpr NominalEarthRadius operator""_R_earth(long double value) { - return NominalEarthRadius(static_cast(value)); + return NominalEarthRadius(static_cast(value)); } constexpr NominalEarthRadius operator""_R_earth(unsigned long long value) { - return NominalEarthRadius(static_cast(value)); + return NominalEarthRadius(static_cast(value)); } constexpr NominalEarthEquatorialRadius operator""_R_eartheq(long double value) { - return NominalEarthEquatorialRadius(static_cast(value)); + return NominalEarthEquatorialRadius(static_cast(value)); } -constexpr NominalEarthEquatorialRadius -operator""_R_eartheq(unsigned long long value) { - return NominalEarthEquatorialRadius(static_cast(value)); +constexpr NominalEarthEquatorialRadius operator""_R_eartheq(unsigned long long value) { + return NominalEarthEquatorialRadius(static_cast(value)); } constexpr EarthMeridionalCircumference operator""_C_mer(long double value) { - return EarthMeridionalCircumference(static_cast(value)); + return EarthMeridionalCircumference(static_cast(value)); } -constexpr EarthMeridionalCircumference -operator""_C_mer(unsigned long long value) { - return EarthMeridionalCircumference(static_cast(value)); +constexpr EarthMeridionalCircumference operator""_C_mer(unsigned long long value) { + return EarthMeridionalCircumference(static_cast(value)); } constexpr EarthEquatorialCircumference operator""_C_eq(long double value) { - return EarthEquatorialCircumference(static_cast(value)); + return EarthEquatorialCircumference(static_cast(value)); } -constexpr EarthEquatorialCircumference -operator""_C_eq(unsigned long long value) { - return EarthEquatorialCircumference(static_cast(value)); +constexpr EarthEquatorialCircumference operator""_C_eq(unsigned long long value) { + return EarthEquatorialCircumference(static_cast(value)); } constexpr NominalJupiterRadius operator""_R_jupiter(long double value) { - return NominalJupiterRadius(static_cast(value)); + return NominalJupiterRadius(static_cast(value)); } constexpr NominalJupiterRadius operator""_R_jupiter(unsigned long long value) { - return NominalJupiterRadius(static_cast(value)); + return NominalJupiterRadius(static_cast(value)); } constexpr NominalSolarRadius operator""_R_sol(long double value) { - return NominalSolarRadius(static_cast(value)); + return NominalSolarRadius(static_cast(value)); } constexpr NominalSolarRadius operator""_R_sol(unsigned long long value) { - return NominalSolarRadius(static_cast(value)); + return NominalSolarRadius(static_cast(value)); } constexpr NominalSolarDiameter operator""_D_sol(long double value) { - return NominalSolarDiameter(static_cast(value)); + return NominalSolarDiameter(static_cast(value)); } constexpr NominalSolarDiameter operator""_D_sol(unsigned long long value) { - return NominalSolarDiameter(static_cast(value)); + return NominalSolarDiameter(static_cast(value)); } // ==================== // Time literals // ==================== + constexpr Attosecond operator""_as(long double value) { - return Attosecond(static_cast(value)); + return Attosecond(static_cast(value)); } constexpr Attosecond operator""_as(unsigned long long value) { - return Attosecond(static_cast(value)); + return Attosecond(static_cast(value)); } constexpr Femtosecond operator""_fs(long double value) { - return Femtosecond(static_cast(value)); + return Femtosecond(static_cast(value)); } constexpr Femtosecond operator""_fs(unsigned long long value) { - return Femtosecond(static_cast(value)); + return Femtosecond(static_cast(value)); } constexpr Picosecond operator""_ps(long double value) { - return Picosecond(static_cast(value)); + return Picosecond(static_cast(value)); } constexpr Picosecond operator""_ps(unsigned long long value) { - return Picosecond(static_cast(value)); + return Picosecond(static_cast(value)); } constexpr Nanosecond operator""_ns(long double value) { - return Nanosecond(static_cast(value)); + return Nanosecond(static_cast(value)); } constexpr Nanosecond operator""_ns(unsigned long long value) { - return Nanosecond(static_cast(value)); + return Nanosecond(static_cast(value)); } constexpr Microsecond operator""_us(long double value) { - return Microsecond(static_cast(value)); + return Microsecond(static_cast(value)); } constexpr Microsecond operator""_us(unsigned long long value) { - return Microsecond(static_cast(value)); + return Microsecond(static_cast(value)); } constexpr Millisecond operator""_ms(long double value) { - return Millisecond(static_cast(value)); + return Millisecond(static_cast(value)); } constexpr Millisecond operator""_ms(unsigned long long value) { - return Millisecond(static_cast(value)); + return Millisecond(static_cast(value)); } constexpr Centisecond operator""_cs(long double value) { - return Centisecond(static_cast(value)); + return Centisecond(static_cast(value)); } constexpr Centisecond operator""_cs(unsigned long long value) { - return Centisecond(static_cast(value)); + return Centisecond(static_cast(value)); } constexpr Decisecond operator""_ds(long double value) { - return Decisecond(static_cast(value)); + return Decisecond(static_cast(value)); } constexpr Decisecond operator""_ds(unsigned long long value) { - return Decisecond(static_cast(value)); + return Decisecond(static_cast(value)); } constexpr Second operator""_s(long double value) { - return Second(static_cast(value)); + return Second(static_cast(value)); } constexpr Second operator""_s(unsigned long long value) { - return Second(static_cast(value)); + return Second(static_cast(value)); } constexpr Decasecond operator""_das(long double value) { - return Decasecond(static_cast(value)); + return Decasecond(static_cast(value)); } constexpr Decasecond operator""_das(unsigned long long value) { - return Decasecond(static_cast(value)); + return Decasecond(static_cast(value)); } constexpr Hectosecond operator""_hs(long double value) { - return Hectosecond(static_cast(value)); + return Hectosecond(static_cast(value)); } constexpr Hectosecond operator""_hs(unsigned long long value) { - return Hectosecond(static_cast(value)); + return Hectosecond(static_cast(value)); } constexpr Kilosecond operator""_ks(long double value) { - return Kilosecond(static_cast(value)); + return Kilosecond(static_cast(value)); } constexpr Kilosecond operator""_ks(unsigned long long value) { - return Kilosecond(static_cast(value)); + return Kilosecond(static_cast(value)); } constexpr Megasecond operator""_Ms(long double value) { - return Megasecond(static_cast(value)); + return Megasecond(static_cast(value)); } constexpr Megasecond operator""_Ms(unsigned long long value) { - return Megasecond(static_cast(value)); + return Megasecond(static_cast(value)); } constexpr Gigasecond operator""_Gs(long double value) { - return Gigasecond(static_cast(value)); + return Gigasecond(static_cast(value)); } constexpr Gigasecond operator""_Gs(unsigned long long value) { - return Gigasecond(static_cast(value)); + return Gigasecond(static_cast(value)); } constexpr Terasecond operator""_Ts(long double value) { - return Terasecond(static_cast(value)); + return Terasecond(static_cast(value)); } constexpr Terasecond operator""_Ts(unsigned long long value) { - return Terasecond(static_cast(value)); + return Terasecond(static_cast(value)); } constexpr Minute operator""_min(long double value) { - return Minute(static_cast(value)); + return Minute(static_cast(value)); } constexpr Minute operator""_min(unsigned long long value) { - return Minute(static_cast(value)); + return Minute(static_cast(value)); } constexpr Hour operator""_h(long double value) { - return Hour(static_cast(value)); + return Hour(static_cast(value)); } constexpr Hour operator""_h(unsigned long long value) { - return Hour(static_cast(value)); + return Hour(static_cast(value)); } constexpr Day operator""_d(long double value) { - return Day(static_cast(value)); + return Day(static_cast(value)); } constexpr Day operator""_d(unsigned long long value) { - return Day(static_cast(value)); + return Day(static_cast(value)); } constexpr Week operator""_wk(long double value) { - return Week(static_cast(value)); + return Week(static_cast(value)); } constexpr Week operator""_wk(unsigned long long value) { - return Week(static_cast(value)); + return Week(static_cast(value)); } constexpr Fortnight operator""_fn(long double value) { - return Fortnight(static_cast(value)); + return Fortnight(static_cast(value)); } constexpr Fortnight operator""_fn(unsigned long long value) { - return Fortnight(static_cast(value)); + return Fortnight(static_cast(value)); } constexpr Year operator""_yr(long double value) { - return Year(static_cast(value)); + return Year(static_cast(value)); } constexpr Year operator""_yr(unsigned long long value) { - return Year(static_cast(value)); + return Year(static_cast(value)); } constexpr Decade operator""_dec(long double value) { - return Decade(static_cast(value)); + return Decade(static_cast(value)); } constexpr Decade operator""_dec(unsigned long long value) { - return Decade(static_cast(value)); + return Decade(static_cast(value)); } constexpr Century operator""_c(long double value) { - return Century(static_cast(value)); + return Century(static_cast(value)); } constexpr Century operator""_c(unsigned long long value) { - return Century(static_cast(value)); + return Century(static_cast(value)); } constexpr Millennium operator""_mill(long double value) { - return Millennium(static_cast(value)); + return Millennium(static_cast(value)); } constexpr Millennium operator""_mill(unsigned long long value) { - return Millennium(static_cast(value)); + return Millennium(static_cast(value)); } constexpr JulianCentury operator""_jc(long double value) { - return JulianCentury(static_cast(value)); + return JulianCentury(static_cast(value)); } constexpr JulianCentury operator""_jc(unsigned long long value) { - return JulianCentury(static_cast(value)); + return JulianCentury(static_cast(value)); } constexpr SiderealDay operator""_sd(long double value) { - return SiderealDay(static_cast(value)); + return SiderealDay(static_cast(value)); } constexpr SiderealDay operator""_sd(unsigned long long value) { - return SiderealDay(static_cast(value)); + return SiderealDay(static_cast(value)); } constexpr SynodicMonth operator""_mo_s(long double value) { - return SynodicMonth(static_cast(value)); + return SynodicMonth(static_cast(value)); } constexpr SynodicMonth operator""_mo_s(unsigned long long value) { - return SynodicMonth(static_cast(value)); + return SynodicMonth(static_cast(value)); } constexpr SiderealYear operator""_yr_s(long double value) { - return SiderealYear(static_cast(value)); + return SiderealYear(static_cast(value)); } constexpr SiderealYear operator""_yr_s(unsigned long long value) { - return SiderealYear(static_cast(value)); + return SiderealYear(static_cast(value)); } // ==================== // Angle literals // ==================== + constexpr Milliradian operator""_mrad(long double value) { - return Milliradian(static_cast(value)); + return Milliradian(static_cast(value)); } constexpr Milliradian operator""_mrad(unsigned long long value) { - return Milliradian(static_cast(value)); + return Milliradian(static_cast(value)); } constexpr Radian operator""_rad(long double value) { - return Radian(static_cast(value)); + return Radian(static_cast(value)); } constexpr Radian operator""_rad(unsigned long long value) { - return Radian(static_cast(value)); + return Radian(static_cast(value)); } constexpr MicroArcsecond operator""_uas(long double value) { - return MicroArcsecond(static_cast(value)); + return MicroArcsecond(static_cast(value)); } constexpr MicroArcsecond operator""_uas(unsigned long long value) { - return MicroArcsecond(static_cast(value)); + return MicroArcsecond(static_cast(value)); } constexpr MilliArcsecond operator""_mas(long double value) { - return MilliArcsecond(static_cast(value)); + return MilliArcsecond(static_cast(value)); } constexpr MilliArcsecond operator""_mas(unsigned long long value) { - return MilliArcsecond(static_cast(value)); + return MilliArcsecond(static_cast(value)); } constexpr Arcsecond operator""_arcsec(long double value) { - return Arcsecond(static_cast(value)); + return Arcsecond(static_cast(value)); } constexpr Arcsecond operator""_arcsec(unsigned long long value) { - return Arcsecond(static_cast(value)); + return Arcsecond(static_cast(value)); } constexpr Arcminute operator""_arcmin(long double value) { - return Arcminute(static_cast(value)); + return Arcminute(static_cast(value)); } constexpr Arcminute operator""_arcmin(unsigned long long value) { - return Arcminute(static_cast(value)); + return Arcminute(static_cast(value)); } constexpr Degree operator""_deg(long double value) { - return Degree(static_cast(value)); + return Degree(static_cast(value)); } constexpr Degree operator""_deg(unsigned long long value) { - return Degree(static_cast(value)); + return Degree(static_cast(value)); } constexpr Gradian operator""_gon(long double value) { - return Gradian(static_cast(value)); + return Gradian(static_cast(value)); } constexpr Gradian operator""_gon(unsigned long long value) { - return Gradian(static_cast(value)); + return Gradian(static_cast(value)); } constexpr Turn operator""_tr(long double value) { - return Turn(static_cast(value)); + return Turn(static_cast(value)); } constexpr Turn operator""_tr(unsigned long long value) { - return Turn(static_cast(value)); + return Turn(static_cast(value)); } // ==================== // Mass literals // ==================== + constexpr Yoctogram operator""_yg(long double value) { - return Yoctogram(static_cast(value)); + return Yoctogram(static_cast(value)); } constexpr Yoctogram operator""_yg(unsigned long long value) { - return Yoctogram(static_cast(value)); + return Yoctogram(static_cast(value)); } constexpr Zeptogram operator""_zg(long double value) { - return Zeptogram(static_cast(value)); + return Zeptogram(static_cast(value)); } constexpr Zeptogram operator""_zg(unsigned long long value) { - return Zeptogram(static_cast(value)); + return Zeptogram(static_cast(value)); } constexpr Attogram operator""_ag(long double value) { - return Attogram(static_cast(value)); + return Attogram(static_cast(value)); } constexpr Attogram operator""_ag(unsigned long long value) { - return Attogram(static_cast(value)); + return Attogram(static_cast(value)); } constexpr Femtogram operator""_fg(long double value) { - return Femtogram(static_cast(value)); + return Femtogram(static_cast(value)); } constexpr Femtogram operator""_fg(unsigned long long value) { - return Femtogram(static_cast(value)); + return Femtogram(static_cast(value)); } constexpr Picogram operator""_pg(long double value) { - return Picogram(static_cast(value)); + return Picogram(static_cast(value)); } constexpr Picogram operator""_pg(unsigned long long value) { - return Picogram(static_cast(value)); + return Picogram(static_cast(value)); } constexpr Nanogram operator""_ng(long double value) { - return Nanogram(static_cast(value)); + return Nanogram(static_cast(value)); } constexpr Nanogram operator""_ng(unsigned long long value) { - return Nanogram(static_cast(value)); + return Nanogram(static_cast(value)); } constexpr Microgram operator""_ug(long double value) { - return Microgram(static_cast(value)); + return Microgram(static_cast(value)); } constexpr Microgram operator""_ug(unsigned long long value) { - return Microgram(static_cast(value)); + return Microgram(static_cast(value)); } constexpr Milligram operator""_mg(long double value) { - return Milligram(static_cast(value)); + return Milligram(static_cast(value)); } constexpr Milligram operator""_mg(unsigned long long value) { - return Milligram(static_cast(value)); + return Milligram(static_cast(value)); } constexpr Centigram operator""_cg(long double value) { - return Centigram(static_cast(value)); + return Centigram(static_cast(value)); } constexpr Centigram operator""_cg(unsigned long long value) { - return Centigram(static_cast(value)); + return Centigram(static_cast(value)); } constexpr Decigram operator""_dg(long double value) { - return Decigram(static_cast(value)); + return Decigram(static_cast(value)); } constexpr Decigram operator""_dg(unsigned long long value) { - return Decigram(static_cast(value)); + return Decigram(static_cast(value)); } constexpr Gram operator""_g(long double value) { - return Gram(static_cast(value)); + return Gram(static_cast(value)); } constexpr Gram operator""_g(unsigned long long value) { - return Gram(static_cast(value)); + return Gram(static_cast(value)); } constexpr Decagram operator""_dag(long double value) { - return Decagram(static_cast(value)); + return Decagram(static_cast(value)); } constexpr Decagram operator""_dag(unsigned long long value) { - return Decagram(static_cast(value)); + return Decagram(static_cast(value)); } constexpr Hectogram operator""_hg(long double value) { - return Hectogram(static_cast(value)); + return Hectogram(static_cast(value)); } constexpr Hectogram operator""_hg(unsigned long long value) { - return Hectogram(static_cast(value)); + return Hectogram(static_cast(value)); } constexpr Kilogram operator""_kg(long double value) { - return Kilogram(static_cast(value)); + return Kilogram(static_cast(value)); } constexpr Kilogram operator""_kg(unsigned long long value) { - return Kilogram(static_cast(value)); + return Kilogram(static_cast(value)); } constexpr Megagram operator""_Mg(long double value) { - return Megagram(static_cast(value)); + return Megagram(static_cast(value)); } constexpr Megagram operator""_Mg(unsigned long long value) { - return Megagram(static_cast(value)); + return Megagram(static_cast(value)); } constexpr Gigagram operator""_Gg(long double value) { - return Gigagram(static_cast(value)); + return Gigagram(static_cast(value)); } constexpr Gigagram operator""_Gg(unsigned long long value) { - return Gigagram(static_cast(value)); + return Gigagram(static_cast(value)); } constexpr Teragram operator""_Tg(long double value) { - return Teragram(static_cast(value)); + return Teragram(static_cast(value)); } constexpr Teragram operator""_Tg(unsigned long long value) { - return Teragram(static_cast(value)); + return Teragram(static_cast(value)); } constexpr Petagram operator""_Pg(long double value) { - return Petagram(static_cast(value)); + return Petagram(static_cast(value)); } constexpr Petagram operator""_Pg(unsigned long long value) { - return Petagram(static_cast(value)); + return Petagram(static_cast(value)); } constexpr Exagram operator""_Eg(long double value) { - return Exagram(static_cast(value)); + return Exagram(static_cast(value)); } constexpr Exagram operator""_Eg(unsigned long long value) { - return Exagram(static_cast(value)); + return Exagram(static_cast(value)); } constexpr Zettagram operator""_Zg(long double value) { - return Zettagram(static_cast(value)); + return Zettagram(static_cast(value)); } constexpr Zettagram operator""_Zg(unsigned long long value) { - return Zettagram(static_cast(value)); + return Zettagram(static_cast(value)); } constexpr Yottagram operator""_Yg(long double value) { - return Yottagram(static_cast(value)); + return Yottagram(static_cast(value)); } constexpr Yottagram operator""_Yg(unsigned long long value) { - return Yottagram(static_cast(value)); + return Yottagram(static_cast(value)); } constexpr Grain operator""_gr(long double value) { - return Grain(static_cast(value)); + return Grain(static_cast(value)); } constexpr Grain operator""_gr(unsigned long long value) { - return Grain(static_cast(value)); + return Grain(static_cast(value)); } constexpr Ounce operator""_oz(long double value) { - return Ounce(static_cast(value)); + return Ounce(static_cast(value)); } constexpr Ounce operator""_oz(unsigned long long value) { - return Ounce(static_cast(value)); + return Ounce(static_cast(value)); } constexpr Pound operator""_lb(long double value) { - return Pound(static_cast(value)); + return Pound(static_cast(value)); } constexpr Pound operator""_lb(unsigned long long value) { - return Pound(static_cast(value)); + return Pound(static_cast(value)); } constexpr Stone operator""_st(long double value) { - return Stone(static_cast(value)); + return Stone(static_cast(value)); } constexpr Stone operator""_st(unsigned long long value) { - return Stone(static_cast(value)); + return Stone(static_cast(value)); } constexpr ShortTon operator""_ton(long double value) { - return ShortTon(static_cast(value)); + return ShortTon(static_cast(value)); } constexpr ShortTon operator""_ton(unsigned long long value) { - return ShortTon(static_cast(value)); + return ShortTon(static_cast(value)); } constexpr LongTon operator""_ton_l(long double value) { - return LongTon(static_cast(value)); + return LongTon(static_cast(value)); } constexpr LongTon operator""_ton_l(unsigned long long value) { - return LongTon(static_cast(value)); + return LongTon(static_cast(value)); } constexpr Carat operator""_ct(long double value) { - return Carat(static_cast(value)); + return Carat(static_cast(value)); } constexpr Carat operator""_ct(unsigned long long value) { - return Carat(static_cast(value)); + return Carat(static_cast(value)); } constexpr Tonne operator""_t(long double value) { - return Tonne(static_cast(value)); + return Tonne(static_cast(value)); } constexpr Tonne operator""_t(unsigned long long value) { - return Tonne(static_cast(value)); + return Tonne(static_cast(value)); } constexpr AtomicMassUnit operator""_u(long double value) { - return AtomicMassUnit(static_cast(value)); + return AtomicMassUnit(static_cast(value)); } constexpr AtomicMassUnit operator""_u(unsigned long long value) { - return AtomicMassUnit(static_cast(value)); + return AtomicMassUnit(static_cast(value)); } constexpr SolarMass operator""_M_sol(long double value) { - return SolarMass(static_cast(value)); + return SolarMass(static_cast(value)); } constexpr SolarMass operator""_M_sol(unsigned long long value) { - return SolarMass(static_cast(value)); + return SolarMass(static_cast(value)); } // ==================== // Power literals // ==================== + constexpr Yoctowatt operator""_yW(long double value) { - return Yoctowatt(static_cast(value)); + return Yoctowatt(static_cast(value)); } constexpr Yoctowatt operator""_yW(unsigned long long value) { - return Yoctowatt(static_cast(value)); + return Yoctowatt(static_cast(value)); } constexpr Zeptowatt operator""_zW(long double value) { - return Zeptowatt(static_cast(value)); + return Zeptowatt(static_cast(value)); } constexpr Zeptowatt operator""_zW(unsigned long long value) { - return Zeptowatt(static_cast(value)); + return Zeptowatt(static_cast(value)); } constexpr Attowatt operator""_aW(long double value) { - return Attowatt(static_cast(value)); + return Attowatt(static_cast(value)); } constexpr Attowatt operator""_aW(unsigned long long value) { - return Attowatt(static_cast(value)); + return Attowatt(static_cast(value)); } constexpr Femtowatt operator""_fW(long double value) { - return Femtowatt(static_cast(value)); + return Femtowatt(static_cast(value)); } constexpr Femtowatt operator""_fW(unsigned long long value) { - return Femtowatt(static_cast(value)); + return Femtowatt(static_cast(value)); } constexpr Picowatt operator""_pW(long double value) { - return Picowatt(static_cast(value)); + return Picowatt(static_cast(value)); } constexpr Picowatt operator""_pW(unsigned long long value) { - return Picowatt(static_cast(value)); + return Picowatt(static_cast(value)); } constexpr Nanowatt operator""_nW(long double value) { - return Nanowatt(static_cast(value)); + return Nanowatt(static_cast(value)); } constexpr Nanowatt operator""_nW(unsigned long long value) { - return Nanowatt(static_cast(value)); + return Nanowatt(static_cast(value)); } constexpr Microwatt operator""_uW(long double value) { - return Microwatt(static_cast(value)); + return Microwatt(static_cast(value)); } constexpr Microwatt operator""_uW(unsigned long long value) { - return Microwatt(static_cast(value)); + return Microwatt(static_cast(value)); } constexpr Milliwatt operator""_mW(long double value) { - return Milliwatt(static_cast(value)); + return Milliwatt(static_cast(value)); } constexpr Milliwatt operator""_mW(unsigned long long value) { - return Milliwatt(static_cast(value)); + return Milliwatt(static_cast(value)); } constexpr Deciwatt operator""_dW(long double value) { - return Deciwatt(static_cast(value)); + return Deciwatt(static_cast(value)); } constexpr Deciwatt operator""_dW(unsigned long long value) { - return Deciwatt(static_cast(value)); + return Deciwatt(static_cast(value)); } constexpr Watt operator""_W(long double value) { - return Watt(static_cast(value)); + return Watt(static_cast(value)); } constexpr Watt operator""_W(unsigned long long value) { - return Watt(static_cast(value)); + return Watt(static_cast(value)); } constexpr Decawatt operator""_daW(long double value) { - return Decawatt(static_cast(value)); + return Decawatt(static_cast(value)); } constexpr Decawatt operator""_daW(unsigned long long value) { - return Decawatt(static_cast(value)); + return Decawatt(static_cast(value)); } constexpr Hectowatt operator""_hW(long double value) { - return Hectowatt(static_cast(value)); + return Hectowatt(static_cast(value)); } constexpr Hectowatt operator""_hW(unsigned long long value) { - return Hectowatt(static_cast(value)); + return Hectowatt(static_cast(value)); } constexpr Kilowatt operator""_kW(long double value) { - return Kilowatt(static_cast(value)); + return Kilowatt(static_cast(value)); } constexpr Kilowatt operator""_kW(unsigned long long value) { - return Kilowatt(static_cast(value)); + return Kilowatt(static_cast(value)); } constexpr Megawatt operator""_MW(long double value) { - return Megawatt(static_cast(value)); + return Megawatt(static_cast(value)); } constexpr Megawatt operator""_MW(unsigned long long value) { - return Megawatt(static_cast(value)); + return Megawatt(static_cast(value)); } constexpr Gigawatt operator""_GW(long double value) { - return Gigawatt(static_cast(value)); + return Gigawatt(static_cast(value)); } constexpr Gigawatt operator""_GW(unsigned long long value) { - return Gigawatt(static_cast(value)); + return Gigawatt(static_cast(value)); } constexpr Terawatt operator""_TW(long double value) { - return Terawatt(static_cast(value)); + return Terawatt(static_cast(value)); } constexpr Terawatt operator""_TW(unsigned long long value) { - return Terawatt(static_cast(value)); + return Terawatt(static_cast(value)); } constexpr Petawatt operator""_PW(long double value) { - return Petawatt(static_cast(value)); + return Petawatt(static_cast(value)); } constexpr Petawatt operator""_PW(unsigned long long value) { - return Petawatt(static_cast(value)); + return Petawatt(static_cast(value)); } constexpr Exawatt operator""_EW(long double value) { - return Exawatt(static_cast(value)); + return Exawatt(static_cast(value)); } constexpr Exawatt operator""_EW(unsigned long long value) { - return Exawatt(static_cast(value)); + return Exawatt(static_cast(value)); } constexpr Zettawatt operator""_ZW(long double value) { - return Zettawatt(static_cast(value)); + return Zettawatt(static_cast(value)); } constexpr Zettawatt operator""_ZW(unsigned long long value) { - return Zettawatt(static_cast(value)); + return Zettawatt(static_cast(value)); } constexpr Yottawatt operator""_YW(long double value) { - return Yottawatt(static_cast(value)); + return Yottawatt(static_cast(value)); } constexpr Yottawatt operator""_YW(unsigned long long value) { - return Yottawatt(static_cast(value)); + return Yottawatt(static_cast(value)); } constexpr ErgPerSecond operator""_erg_per_s(long double value) { - return ErgPerSecond(static_cast(value)); + return ErgPerSecond(static_cast(value)); } constexpr ErgPerSecond operator""_erg_per_s(unsigned long long value) { - return ErgPerSecond(static_cast(value)); + return ErgPerSecond(static_cast(value)); } constexpr HorsepowerMetric operator""_PS(long double value) { - return HorsepowerMetric(static_cast(value)); + return HorsepowerMetric(static_cast(value)); } constexpr HorsepowerMetric operator""_PS(unsigned long long value) { - return HorsepowerMetric(static_cast(value)); + return HorsepowerMetric(static_cast(value)); } constexpr HorsepowerElectric operator""_hp_e(long double value) { - return HorsepowerElectric(static_cast(value)); + return HorsepowerElectric(static_cast(value)); } constexpr HorsepowerElectric operator""_hp_e(unsigned long long value) { - return HorsepowerElectric(static_cast(value)); + return HorsepowerElectric(static_cast(value)); } constexpr SolarLuminosity operator""_L_sol(long double value) { - return SolarLuminosity(static_cast(value)); + return SolarLuminosity(static_cast(value)); } constexpr SolarLuminosity operator""_L_sol(unsigned long long value) { - return SolarLuminosity(static_cast(value)); + return SolarLuminosity(static_cast(value)); } } // namespace literals diff --git a/include/qtty/units/angular.hpp b/include/qtty/units/angular.hpp index 5e0dbea..dbe8eb2 100644 --- a/include/qtty/units/angular.hpp +++ b/include/qtty/units/angular.hpp @@ -1,6 +1,3 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once #include "../ffi_core.hpp" @@ -18,45 +15,45 @@ struct GradianTag {}; struct TurnTag {}; struct HourAngleTag {}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIRADIAN; } - static constexpr std::string_view symbol() { return "mrad"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIRADIAN; } + static constexpr std::string_view symbol() { return "mrad"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_RADIAN; } - static constexpr std::string_view symbol() { return "rad"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_RADIAN; } + static constexpr std::string_view symbol() { return "rad"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICRO_ARCSECOND; } - static constexpr std::string_view symbol() { return "µas"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICRO_ARCSECOND; } + static constexpr std::string_view symbol() { return "µas"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLI_ARCSECOND; } - static constexpr std::string_view symbol() { return "mas"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLI_ARCSECOND; } + static constexpr std::string_view symbol() { return "mas"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ARCSECOND; } - static constexpr std::string_view symbol() { return "″"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ARCSECOND; } + static constexpr std::string_view symbol() { return "″"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ARCMINUTE; } - static constexpr std::string_view symbol() { return "′"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ARCMINUTE; } + static constexpr std::string_view symbol() { return "′"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DEGREE; } - static constexpr std::string_view symbol() { return "°"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DEGREE; } + static constexpr std::string_view symbol() { return "°"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRADIAN; } - static constexpr std::string_view symbol() { return "gon"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRADIAN; } + static constexpr std::string_view symbol() { return "gon"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TURN; } - static constexpr std::string_view symbol() { return "tr"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TURN; } + static constexpr std::string_view symbol() { return "tr"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HOUR_ANGLE; } - static constexpr std::string_view symbol() { return "ʰ"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HOUR_ANGLE; } + static constexpr std::string_view symbol() { return "ʰ"; } }; using Milliradian = Quantity; diff --git a/include/qtty/units/length.hpp b/include/qtty/units/length.hpp index f0c629a..04d11b8 100644 --- a/include/qtty/units/length.hpp +++ b/include/qtty/units/length.hpp @@ -1,6 +1,3 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once #include "../ffi_core.hpp" @@ -58,217 +55,205 @@ struct NominalJupiterRadiusTag {}; struct NominalSolarRadiusTag {}; struct NominalSolarDiameterTag {}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PLANCK_LENGTH; } - static constexpr std::string_view symbol() { return "l_P"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOMETER; } - static constexpr std::string_view symbol() { return "ym"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOMETER; } - static constexpr std::string_view symbol() { return "zm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOMETER; } - static constexpr std::string_view symbol() { return "am"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOMETER; } - static constexpr std::string_view symbol() { return "fm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOMETER; } - static constexpr std::string_view symbol() { return "pm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOMETER; } - static constexpr std::string_view symbol() { return "nm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROMETER; } - static constexpr std::string_view symbol() { return "µm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIMETER; } - static constexpr std::string_view symbol() { return "mm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTIMETER; } - static constexpr std::string_view symbol() { return "cm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIMETER; } - static constexpr std::string_view symbol() { return "dm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_METER; } - static constexpr std::string_view symbol() { return "m"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAMETER; } - static constexpr std::string_view symbol() { return "dam"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOMETER; } - static constexpr std::string_view symbol() { return "hm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOMETER; } - static constexpr std::string_view symbol() { return "km"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAMETER; } - static constexpr std::string_view symbol() { return "Mm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAMETER; } - static constexpr std::string_view symbol() { return "Gm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAMETER; } - static constexpr std::string_view symbol() { return "Tm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAMETER; } - static constexpr std::string_view symbol() { return "Pm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAMETER; } - static constexpr std::string_view symbol() { return "Em"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAMETER; } - static constexpr std::string_view symbol() { return "Zm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAMETER; } - static constexpr std::string_view symbol() { return "Ym"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_BOHR_RADIUS; } - static constexpr std::string_view symbol() { return "a₀"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_CLASSICAL_ELECTRON_RADIUS; - } - static constexpr std::string_view symbol() { return "r_e"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_ELECTRON_REDUCED_COMPTON_WAVELENGTH; - } - static constexpr std::string_view symbol() { return "λ̄_e"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ASTRONOMICAL_UNIT; } - static constexpr std::string_view symbol() { return "au"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LIGHT_YEAR; } - static constexpr std::string_view symbol() { return "ly"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PARSEC; } - static constexpr std::string_view symbol() { return "pc"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOPARSEC; } - static constexpr std::string_view symbol() { return "kpc"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAPARSEC; } - static constexpr std::string_view symbol() { return "Mpc"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAPARSEC; } - static constexpr std::string_view symbol() { return "Gpc"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_INCH; } - static constexpr std::string_view symbol() { return "in"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FOOT; } - static constexpr std::string_view symbol() { return "ft"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YARD; } - static constexpr std::string_view symbol() { return "yd"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILE; } - static constexpr std::string_view symbol() { return "mi"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LINK; } - static constexpr std::string_view symbol() { return "lk"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FATHOM; } - static constexpr std::string_view symbol() { return "ftm"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ROD; } - static constexpr std::string_view symbol() { return "rd"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CHAIN; } - static constexpr std::string_view symbol() { return "ch"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NAUTICAL_MILE; } - static constexpr std::string_view symbol() { return "nmi"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_RADIUS; } - static constexpr std::string_view symbol() { return "R_☾"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_DISTANCE; } - static constexpr std::string_view symbol() { return "LD"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_NOMINAL_EARTH_POLAR_RADIUS; - } - static constexpr std::string_view symbol() { return "R_⊕pol"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_RADIUS; } - static constexpr std::string_view symbol() { return "R_⊕"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_NOMINAL_EARTH_EQUATORIAL_RADIUS; - } - static constexpr std::string_view symbol() { return "R_⊕eq"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_EARTH_MERIDIONAL_CIRCUMFERENCE; - } - static constexpr std::string_view symbol() { return "C_mer"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { - return UNIT_ID_EARTH_EQUATORIAL_CIRCUMFERENCE; - } - static constexpr std::string_view symbol() { return "C_eq"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_JUPITER_RADIUS; } - static constexpr std::string_view symbol() { return "R_♃"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_RADIUS; } - static constexpr std::string_view symbol() { return "R_☉"; } -}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_DIAMETER; } - static constexpr std::string_view symbol() { return "D_☉"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PLANCK_LENGTH; } + static constexpr std::string_view symbol() { return "l_P"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOMETER; } + static constexpr std::string_view symbol() { return "ym"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOMETER; } + static constexpr std::string_view symbol() { return "zm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOMETER; } + static constexpr std::string_view symbol() { return "am"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOMETER; } + static constexpr std::string_view symbol() { return "fm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOMETER; } + static constexpr std::string_view symbol() { return "pm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOMETER; } + static constexpr std::string_view symbol() { return "nm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROMETER; } + static constexpr std::string_view symbol() { return "µm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIMETER; } + static constexpr std::string_view symbol() { return "mm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTIMETER; } + static constexpr std::string_view symbol() { return "cm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIMETER; } + static constexpr std::string_view symbol() { return "dm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_METER; } + static constexpr std::string_view symbol() { return "m"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAMETER; } + static constexpr std::string_view symbol() { return "dam"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOMETER; } + static constexpr std::string_view symbol() { return "hm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOMETER; } + static constexpr std::string_view symbol() { return "km"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAMETER; } + static constexpr std::string_view symbol() { return "Mm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAMETER; } + static constexpr std::string_view symbol() { return "Gm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAMETER; } + static constexpr std::string_view symbol() { return "Tm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAMETER; } + static constexpr std::string_view symbol() { return "Pm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAMETER; } + static constexpr std::string_view symbol() { return "Em"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAMETER; } + static constexpr std::string_view symbol() { return "Zm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAMETER; } + static constexpr std::string_view symbol() { return "Ym"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_BOHR_RADIUS; } + static constexpr std::string_view symbol() { return "a₀"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CLASSICAL_ELECTRON_RADIUS; } + static constexpr std::string_view symbol() { return "r_e"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ELECTRON_REDUCED_COMPTON_WAVELENGTH; } + static constexpr std::string_view symbol() { return "λ̄_e"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ASTRONOMICAL_UNIT; } + static constexpr std::string_view symbol() { return "au"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LIGHT_YEAR; } + static constexpr std::string_view symbol() { return "ly"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PARSEC; } + static constexpr std::string_view symbol() { return "pc"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOPARSEC; } + static constexpr std::string_view symbol() { return "kpc"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAPARSEC; } + static constexpr std::string_view symbol() { return "Mpc"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAPARSEC; } + static constexpr std::string_view symbol() { return "Gpc"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_INCH; } + static constexpr std::string_view symbol() { return "in"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FOOT; } + static constexpr std::string_view symbol() { return "ft"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YARD; } + static constexpr std::string_view symbol() { return "yd"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILE; } + static constexpr std::string_view symbol() { return "mi"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LINK; } + static constexpr std::string_view symbol() { return "lk"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FATHOM; } + static constexpr std::string_view symbol() { return "ftm"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ROD; } + static constexpr std::string_view symbol() { return "rd"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CHAIN; } + static constexpr std::string_view symbol() { return "ch"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NAUTICAL_MILE; } + static constexpr std::string_view symbol() { return "nmi"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_RADIUS; } + static constexpr std::string_view symbol() { return "R_☾"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_DISTANCE; } + static constexpr std::string_view symbol() { return "LD"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_POLAR_RADIUS; } + static constexpr std::string_view symbol() { return "R_⊕pol"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_RADIUS; } + static constexpr std::string_view symbol() { return "R_⊕"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_EQUATORIAL_RADIUS; } + static constexpr std::string_view symbol() { return "R_⊕eq"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EARTH_MERIDIONAL_CIRCUMFERENCE; } + static constexpr std::string_view symbol() { return "C_mer"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EARTH_EQUATORIAL_CIRCUMFERENCE; } + static constexpr std::string_view symbol() { return "C_eq"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_JUPITER_RADIUS; } + static constexpr std::string_view symbol() { return "R_♃"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_RADIUS; } + static constexpr std::string_view symbol() { return "R_☉"; } +}; +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_DIAMETER; } + static constexpr std::string_view symbol() { return "D_☉"; } }; using PlanckLength = Quantity; @@ -295,8 +280,7 @@ using Zettameter = Quantity; using Yottameter = Quantity; using BohrRadius = Quantity; using ClassicalElectronRadius = Quantity; -using ElectronReducedComptonWavelength = - Quantity; +using ElectronReducedComptonWavelength = Quantity; using AstronomicalUnit = Quantity; using LightYear = Quantity; using Parsec = Quantity; diff --git a/include/qtty/units/mass.hpp b/include/qtty/units/mass.hpp index c701cc3..dcc5841 100644 --- a/include/qtty/units/mass.hpp +++ b/include/qtty/units/mass.hpp @@ -1,6 +1,3 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once #include "../ffi_core.hpp" @@ -39,129 +36,129 @@ struct TonneTag {}; struct AtomicMassUnitTag {}; struct SolarMassTag {}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOGRAM; } - static constexpr std::string_view symbol() { return "yg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOGRAM; } + static constexpr std::string_view symbol() { return "yg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOGRAM; } - static constexpr std::string_view symbol() { return "zg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOGRAM; } + static constexpr std::string_view symbol() { return "zg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOGRAM; } - static constexpr std::string_view symbol() { return "ag"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOGRAM; } + static constexpr std::string_view symbol() { return "ag"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOGRAM; } - static constexpr std::string_view symbol() { return "fg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOGRAM; } + static constexpr std::string_view symbol() { return "fg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOGRAM; } - static constexpr std::string_view symbol() { return "pg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOGRAM; } + static constexpr std::string_view symbol() { return "pg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOGRAM; } - static constexpr std::string_view symbol() { return "ng"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOGRAM; } + static constexpr std::string_view symbol() { return "ng"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROGRAM; } - static constexpr std::string_view symbol() { return "µg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROGRAM; } + static constexpr std::string_view symbol() { return "µg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIGRAM; } - static constexpr std::string_view symbol() { return "mg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIGRAM; } + static constexpr std::string_view symbol() { return "mg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTIGRAM; } - static constexpr std::string_view symbol() { return "cg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTIGRAM; } + static constexpr std::string_view symbol() { return "cg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIGRAM; } - static constexpr std::string_view symbol() { return "dg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIGRAM; } + static constexpr std::string_view symbol() { return "dg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRAM; } - static constexpr std::string_view symbol() { return "g"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRAM; } + static constexpr std::string_view symbol() { return "g"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAGRAM; } - static constexpr std::string_view symbol() { return "dag"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAGRAM; } + static constexpr std::string_view symbol() { return "dag"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOGRAM; } - static constexpr std::string_view symbol() { return "hg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOGRAM; } + static constexpr std::string_view symbol() { return "hg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOGRAM; } - static constexpr std::string_view symbol() { return "kg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOGRAM; } + static constexpr std::string_view symbol() { return "kg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAGRAM; } - static constexpr std::string_view symbol() { return "Mg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAGRAM; } + static constexpr std::string_view symbol() { return "Mg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAGRAM; } - static constexpr std::string_view symbol() { return "Gg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAGRAM; } + static constexpr std::string_view symbol() { return "Gg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAGRAM; } - static constexpr std::string_view symbol() { return "Tg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAGRAM; } + static constexpr std::string_view symbol() { return "Tg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAGRAM; } - static constexpr std::string_view symbol() { return "Pg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAGRAM; } + static constexpr std::string_view symbol() { return "Pg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAGRAM; } - static constexpr std::string_view symbol() { return "Eg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAGRAM; } + static constexpr std::string_view symbol() { return "Eg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAGRAM; } - static constexpr std::string_view symbol() { return "Zg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAGRAM; } + static constexpr std::string_view symbol() { return "Zg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAGRAM; } - static constexpr std::string_view symbol() { return "Yg"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAGRAM; } + static constexpr std::string_view symbol() { return "Yg"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRAIN; } - static constexpr std::string_view symbol() { return "gr"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRAIN; } + static constexpr std::string_view symbol() { return "gr"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_OUNCE; } - static constexpr std::string_view symbol() { return "oz"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_OUNCE; } + static constexpr std::string_view symbol() { return "oz"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_POUND; } - static constexpr std::string_view symbol() { return "lb"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_POUND; } + static constexpr std::string_view symbol() { return "lb"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_STONE; } - static constexpr std::string_view symbol() { return "st"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_STONE; } + static constexpr std::string_view symbol() { return "st"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SHORT_TON; } - static constexpr std::string_view symbol() { return "ton"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SHORT_TON; } + static constexpr std::string_view symbol() { return "ton"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LONG_TON; } - static constexpr std::string_view symbol() { return "ton_l"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LONG_TON; } + static constexpr std::string_view symbol() { return "ton_l"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CARAT; } - static constexpr std::string_view symbol() { return "ct"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CARAT; } + static constexpr std::string_view symbol() { return "ct"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TONNE; } - static constexpr std::string_view symbol() { return "t"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TONNE; } + static constexpr std::string_view symbol() { return "t"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATOMIC_MASS_UNIT; } - static constexpr std::string_view symbol() { return "u"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATOMIC_MASS_UNIT; } + static constexpr std::string_view symbol() { return "u"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_MASS; } - static constexpr std::string_view symbol() { return "M_☉"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_MASS; } + static constexpr std::string_view symbol() { return "M_☉"; } }; using Yoctogram = Quantity; diff --git a/include/qtty/units/power.hpp b/include/qtty/units/power.hpp index c9608bd..9015934 100644 --- a/include/qtty/units/power.hpp +++ b/include/qtty/units/power.hpp @@ -1,6 +1,3 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once #include "../ffi_core.hpp" @@ -32,101 +29,101 @@ struct HorsepowerMetricTag {}; struct HorsepowerElectricTag {}; struct SolarLuminosityTag {}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOWATT; } - static constexpr std::string_view symbol() { return "yW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOWATT; } + static constexpr std::string_view symbol() { return "yW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOWATT; } - static constexpr std::string_view symbol() { return "zW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOWATT; } + static constexpr std::string_view symbol() { return "zW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOWATT; } - static constexpr std::string_view symbol() { return "aW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOWATT; } + static constexpr std::string_view symbol() { return "aW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOWATT; } - static constexpr std::string_view symbol() { return "fW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOWATT; } + static constexpr std::string_view symbol() { return "fW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOWATT; } - static constexpr std::string_view symbol() { return "pW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOWATT; } + static constexpr std::string_view symbol() { return "pW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOWATT; } - static constexpr std::string_view symbol() { return "nW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOWATT; } + static constexpr std::string_view symbol() { return "nW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROWATT; } - static constexpr std::string_view symbol() { return "µW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROWATT; } + static constexpr std::string_view symbol() { return "µW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIWATT; } - static constexpr std::string_view symbol() { return "mW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIWATT; } + static constexpr std::string_view symbol() { return "mW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIWATT; } - static constexpr std::string_view symbol() { return "dW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIWATT; } + static constexpr std::string_view symbol() { return "dW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_WATT; } - static constexpr std::string_view symbol() { return "W"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_WATT; } + static constexpr std::string_view symbol() { return "W"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAWATT; } - static constexpr std::string_view symbol() { return "daW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAWATT; } + static constexpr std::string_view symbol() { return "daW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOWATT; } - static constexpr std::string_view symbol() { return "hW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOWATT; } + static constexpr std::string_view symbol() { return "hW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOWATT; } - static constexpr std::string_view symbol() { return "kW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOWATT; } + static constexpr std::string_view symbol() { return "kW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAWATT; } - static constexpr std::string_view symbol() { return "MW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAWATT; } + static constexpr std::string_view symbol() { return "MW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAWATT; } - static constexpr std::string_view symbol() { return "GW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAWATT; } + static constexpr std::string_view symbol() { return "GW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAWATT; } - static constexpr std::string_view symbol() { return "TW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAWATT; } + static constexpr std::string_view symbol() { return "TW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAWATT; } - static constexpr std::string_view symbol() { return "PW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAWATT; } + static constexpr std::string_view symbol() { return "PW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAWATT; } - static constexpr std::string_view symbol() { return "EW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAWATT; } + static constexpr std::string_view symbol() { return "EW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAWATT; } - static constexpr std::string_view symbol() { return "ZW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAWATT; } + static constexpr std::string_view symbol() { return "ZW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAWATT; } - static constexpr std::string_view symbol() { return "YW"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAWATT; } + static constexpr std::string_view symbol() { return "YW"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ERG_PER_SECOND; } - static constexpr std::string_view symbol() { return "erg/s"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ERG_PER_SECOND; } + static constexpr std::string_view symbol() { return "erg/s"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_METRIC; } - static constexpr std::string_view symbol() { return "PS"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_METRIC; } + static constexpr std::string_view symbol() { return "PS"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_ELECTRIC; } - static constexpr std::string_view symbol() { return "hp_e"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_ELECTRIC; } + static constexpr std::string_view symbol() { return "hp_e"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_LUMINOSITY; } - static constexpr std::string_view symbol() { return "L_☉"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_LUMINOSITY; } + static constexpr std::string_view symbol() { return "L_☉"; } }; using Yoctowatt = Quantity; diff --git a/include/qtty/units/time.hpp b/include/qtty/units/time.hpp index b0d69b3..6747186 100644 --- a/include/qtty/units/time.hpp +++ b/include/qtty/units/time.hpp @@ -1,6 +1,3 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - #pragma once #include "../ffi_core.hpp" @@ -37,121 +34,121 @@ struct SiderealDayTag {}; struct SynodicMonthTag {}; struct SiderealYearTag {}; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOSECOND; } - static constexpr std::string_view symbol() { return "as"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOSECOND; } + static constexpr std::string_view symbol() { return "as"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOSECOND; } - static constexpr std::string_view symbol() { return "fs"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOSECOND; } + static constexpr std::string_view symbol() { return "fs"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOSECOND; } - static constexpr std::string_view symbol() { return "ps"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOSECOND; } + static constexpr std::string_view symbol() { return "ps"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOSECOND; } - static constexpr std::string_view symbol() { return "ns"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOSECOND; } + static constexpr std::string_view symbol() { return "ns"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROSECOND; } - static constexpr std::string_view symbol() { return "µs"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROSECOND; } + static constexpr std::string_view symbol() { return "µs"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLISECOND; } - static constexpr std::string_view symbol() { return "ms"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLISECOND; } + static constexpr std::string_view symbol() { return "ms"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTISECOND; } - static constexpr std::string_view symbol() { return "cs"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTISECOND; } + static constexpr std::string_view symbol() { return "cs"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECISECOND; } - static constexpr std::string_view symbol() { return "ds"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECISECOND; } + static constexpr std::string_view symbol() { return "ds"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SECOND; } - static constexpr std::string_view symbol() { return "s"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SECOND; } + static constexpr std::string_view symbol() { return "s"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECASECOND; } - static constexpr std::string_view symbol() { return "das"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECASECOND; } + static constexpr std::string_view symbol() { return "das"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOSECOND; } - static constexpr std::string_view symbol() { return "hs"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOSECOND; } + static constexpr std::string_view symbol() { return "hs"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOSECOND; } - static constexpr std::string_view symbol() { return "ks"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOSECOND; } + static constexpr std::string_view symbol() { return "ks"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGASECOND; } - static constexpr std::string_view symbol() { return "Ms"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGASECOND; } + static constexpr std::string_view symbol() { return "Ms"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGASECOND; } - static constexpr std::string_view symbol() { return "Gs"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGASECOND; } + static constexpr std::string_view symbol() { return "Gs"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERASECOND; } - static constexpr std::string_view symbol() { return "Ts"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERASECOND; } + static constexpr std::string_view symbol() { return "Ts"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MINUTE; } - static constexpr std::string_view symbol() { return "min"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MINUTE; } + static constexpr std::string_view symbol() { return "min"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HOUR; } - static constexpr std::string_view symbol() { return "h"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HOUR; } + static constexpr std::string_view symbol() { return "h"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DAY; } - static constexpr std::string_view symbol() { return "d"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DAY; } + static constexpr std::string_view symbol() { return "d"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_WEEK; } - static constexpr std::string_view symbol() { return "wk"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_WEEK; } + static constexpr std::string_view symbol() { return "wk"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FORTNIGHT; } - static constexpr std::string_view symbol() { return "fn"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FORTNIGHT; } + static constexpr std::string_view symbol() { return "fn"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YEAR; } - static constexpr std::string_view symbol() { return "yr"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YEAR; } + static constexpr std::string_view symbol() { return "yr"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECADE; } - static constexpr std::string_view symbol() { return "dec"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECADE; } + static constexpr std::string_view symbol() { return "dec"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTURY; } - static constexpr std::string_view symbol() { return "c"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTURY; } + static constexpr std::string_view symbol() { return "c"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLENNIUM; } - static constexpr std::string_view symbol() { return "mill"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLENNIUM; } + static constexpr std::string_view symbol() { return "mill"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_YEAR; } - static constexpr std::string_view symbol() { return "a"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_YEAR; } + static constexpr std::string_view symbol() { return "a"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_CENTURY; } - static constexpr std::string_view symbol() { return "jc"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_CENTURY; } + static constexpr std::string_view symbol() { return "jc"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_DAY; } - static constexpr std::string_view symbol() { return "sd"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_DAY; } + static constexpr std::string_view symbol() { return "sd"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SYNODIC_MONTH; } - static constexpr std::string_view symbol() { return "mo_s"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SYNODIC_MONTH; } + static constexpr std::string_view symbol() { return "mo_s"; } }; -template <> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_YEAR; } - static constexpr std::string_view symbol() { return "yr_s"; } +template<> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_YEAR; } + static constexpr std::string_view symbol() { return "yr_s"; } }; using Attosecond = Quantity; diff --git a/qtty b/qtty index 8140428..27662c5 160000 --- a/qtty +++ b/qtty @@ -1 +1 @@ -Subproject commit 814042804bce724720662bd77158b1052e922450 +Subproject commit 27662c5465ff88963066c7ab5bec164bd8e8e095 diff --git a/tests/test_formatting.cpp b/tests/test_formatting.cpp new file mode 100644 index 0000000..0bc438f --- /dev/null +++ b/tests/test_formatting.cpp @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + +/** + * @file test_formatting.cpp + * @brief Tests for Quantity string formatting: operator<<, format(), and + * std::formatter (C++20). + * + * These tests verify that every formatting annotation available in Rust + * (Display `{}`, `{:.N}`, `{:e}`, `{:.Ne}`, `{:E}`, `{:.NE}`) is matched + * by the corresponding C++ facility. + * + * Rust ↔ C++ mapping + * ------------------ + * Rust `{}` → operator<< (default) / format(-1, QTTY_FMT_DEFAULT) + * Rust `{:.2}` → std::setprecision(2) << std::fixed / format(2) + * Rust `{:e}` → std::scientific / format(-1, QTTY_FMT_LOWER_EXP) + * Rust `{:.4e}` → std::scientific << std::setprecision(4) / format(4, QTTY_FMT_LOWER_EXP) + * Rust `{:E}` → format(-1, QTTY_FMT_UPPER_EXP) + * Rust `{:.4E}` → format(4, QTTY_FMT_UPPER_EXP) + */ + +#include "fixtures.hpp" +#include +#include +#include + +// ─── Helper ───────────────────────────────────────────────────────────────── + +/// Stream a quantity with the given manipulators and return the string. +template +static std::string stream_qty(const Q &q) { + std::ostringstream oss; + oss << q; + return oss.str(); +} + +template +static std::string stream_qty_with(const Q &q, Manips &&...manips) { + std::ostringstream oss; + // Apply all manipulators and then stream the quantity + (oss << ... << std::forward(manips)) << q; + return oss.str(); +} + +// Fixture used for all formatting tests +class FormattingTest : public QttyTest {}; + +// ───────────────────────────────────────────────────────────────────────────── +// operator<< tests (mirrors Rust Display `{}`) +// ───────────────────────────────────────────────────────────────────────────── + +TEST_F(FormattingTest, StreamDefaultDecimal) { + Second s(1234.56789); + // std::ostream default precision is 6 significant digits. + EXPECT_EQ(stream_qty(s), "1234.57 s"); +} + +TEST_F(FormattingTest, StreamPrecisionFixed) { + Second s(1234.56789); + std::ostringstream oss; + oss << std::fixed << std::setprecision(2) << s; + EXPECT_EQ(oss.str(), "1234.57 s"); +} + +TEST_F(FormattingTest, StreamScientificLower) { + Second s(1234.56789); + std::ostringstream oss; + oss << std::scientific << s; + // std::scientific produces at least 2-digit exponents on most platforms; + // just check the number part and the unit suffix. + std::string result = oss.str(); + // Must end with " s" + EXPECT_EQ(result.back(), 's'); + // Must contain 'e' + EXPECT_NE(result.find('e'), std::string::npos); +} + +TEST_F(FormattingTest, StreamScientificLowerWithPrecision) { + Second s(1234.56789); + std::ostringstream oss; + oss << std::scientific << std::setprecision(4) << s; + std::string result = oss.str(); + EXPECT_NE(result.find('e'), std::string::npos); + EXPECT_TRUE(result.find("1.2346e") != std::string::npos || + result.find("1.2346E") != std::string::npos) + << "Got: " << result; +} + +TEST_F(FormattingTest, StreamDefaultMeter) { + Meter m(42.0); + EXPECT_EQ(stream_qty(m), "42 m"); +} + +TEST_F(FormattingTest, StreamNegativeValue) { + Meter m(-42.5); + EXPECT_EQ(stream_qty(m), "-42.5 m"); +} + +TEST_F(FormattingTest, StreamKilometerConvertedValue) { + Kilometer km(1.5); + EXPECT_EQ(stream_qty(km), "1.5 km"); +} + +// ───────────────────────────────────────────────────────────────────────────── +// format() method tests (mirrors Rust Display/LowerExp/UpperExp) +// ───────────────────────────────────────────────────────────────────────────── + +TEST_F(FormattingTest, FormatDefaultNoPrecision) { + Second s(1234.56789); + EXPECT_EQ(s.format(), "1234.56789 s"); +} + +TEST_F(FormattingTest, FormatDefaultTwoDecimalPlaces) { + Second s(1234.56789); + EXPECT_EQ(s.format(2), "1234.57 s"); +} + +TEST_F(FormattingTest, FormatDefaultZeroDecimalPlaces) { + Second s(1234.56789); + EXPECT_EQ(s.format(0), "1235 s"); +} + +TEST_F(FormattingTest, FormatDefaultFiveDecimalPlaces) { + Second s(1234.56789); + EXPECT_EQ(s.format(5), "1234.56789 s"); +} + +TEST_F(FormattingTest, FormatLowerExpNoPrecision) { + Second s(1234.56789); + // Rust {:e} → Rust compact form: 1.23456789e3 s + EXPECT_EQ(s.format(-1, QTTY_FMT_LOWER_EXP), "1.23456789e3 s"); +} + +TEST_F(FormattingTest, FormatLowerExpFourDecimalPlaces) { + Second s(1234.56789); + // Rust {:.4e} → 1.2346e3 s + EXPECT_EQ(s.format(4, QTTY_FMT_LOWER_EXP), "1.2346e3 s"); +} + +TEST_F(FormattingTest, FormatLowerExpZeroDecimalPlaces) { + Second s(1234.56789); + EXPECT_EQ(s.format(0, QTTY_FMT_LOWER_EXP), "1e3 s"); +} + +TEST_F(FormattingTest, FormatUpperExpNoPrecision) { + Second s(1234.56789); + EXPECT_EQ(s.format(-1, QTTY_FMT_UPPER_EXP), "1.23456789E3 s"); +} + +TEST_F(FormattingTest, FormatUpperExpFourDecimalPlaces) { + Second s(1234.56789); + EXPECT_EQ(s.format(4, QTTY_FMT_UPPER_EXP), "1.2346E3 s"); +} + +TEST_F(FormattingTest, FormatNegativeValue) { + Meter m(-42.5); + EXPECT_EQ(m.format(), "-42.5 m"); + EXPECT_EQ(m.format(1), "-42.5 m"); + EXPECT_EQ(m.format(2, QTTY_FMT_LOWER_EXP), "-4.25e1 m"); +} + +TEST_F(FormattingTest, FormatZeroValue) { + Second s(0.0); + EXPECT_EQ(s.format(), "0 s"); + EXPECT_EQ(s.format(2), "0.00 s"); +} + +TEST_F(FormattingTest, FormatMeterDefault) { + Meter m(42.0); + EXPECT_EQ(m.format(), "42 m"); +} + +TEST_F(FormattingTest, FormatKilometerDefault) { + Kilometer km(1.5); + EXPECT_EQ(km.format(), "1.5 km"); +} + +TEST_F(FormattingTest, FormatLargeValue) { + Meter m(1.5e12); + EXPECT_EQ(m.format(2, QTTY_FMT_LOWER_EXP), "1.50e12 m"); +} + +// Verify format() with precision=2 matches operator<< with fixed+setprecision(2). +TEST_F(FormattingTest, FormatMatchesStream) { + Second s(1234.56789); + std::ostringstream oss; + oss << std::fixed << std::setprecision(2) << s; + EXPECT_EQ(s.format(2), oss.str()); +} From 71ec843fcd57e9647685b9cc9430446d0f6e6e0c Mon Sep 17 00:00:00 2001 From: VPRamon Date: Thu, 26 Feb 2026 16:51:04 +0100 Subject: [PATCH 2/2] Add SPDX license and copyright notices; update unit traits formatting - Added SPDX license identifier and copyright notice to power.hpp and time.hpp files. - Reformatted UnitTraits specializations for various power and time units for consistency. - Introduced a new script run-ci-locally.sh to facilitate local CI testing, mirroring GitHub Actions workflow. - Updated test_formatting.cpp to improve comment formatting and maintain consistency in code style. --- .gitignore | 3 +- include/qtty/ffi_core.hpp | 22 +- include/qtty/literals.hpp | 595 +++++++++++++++++---------------- include/qtty/units/angular.hpp | 63 ++-- include/qtty/units/length.hpp | 416 ++++++++++++----------- include/qtty/units/mass.hpp | 189 +++++------ include/qtty/units/power.hpp | 147 ++++---- include/qtty/units/time.hpp | 177 +++++----- qtty | 2 +- run-ci-locally.sh | 391 ++++++++++++++++++++++ tests/test_formatting.cpp | 12 +- 11 files changed, 1220 insertions(+), 797 deletions(-) create mode 100755 run-ci-locally.sh diff --git a/.gitignore b/.gitignore index 0fea79a..36f66fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Build directories -build/ +build*/ +coverage*/ cmake-build-*/ out/ gen_cpp_units/target/ diff --git a/include/qtty/ffi_core.hpp b/include/qtty/ffi_core.hpp index b332135..aa25299 100644 --- a/include/qtty/ffi_core.hpp +++ b/include/qtty/ffi_core.hpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -363,8 +363,8 @@ template class Quantity { if (result == QTTY_ERR_BUFFER_TOO_SMALL) { // Retry with a generous large buffer (quantities should never need this) char big_buf[4096]; - result = qtty_quantity_format(qty, precision, flags, big_buf, - sizeof(big_buf)); + result = + qtty_quantity_format(qty, precision, flags, big_buf, sizeof(big_buf)); if (result < 0) { throw QttyException("format: buffer too small even at 4096 bytes"); } @@ -386,9 +386,10 @@ template class Quantity { // `std::ostream`, all standard stream format manipulators are respected: // // std::cout << std::fixed << std::setprecision(2) << qty; // "1234.57 m" -// std::cout << std::scientific << qty; // "1.23457e+003 m" -// std::cout << std::scientific << std::setprecision(4) -// << qty; // "1.2346e+003 m" +// std::cout << std::scientific << qty; // "1.23457e+003 +// m" std::cout << std::scientific << std::setprecision(4) +// << qty; // "1.2346e+003 +// m" // // For `std::format` (C++20) see the std::formatter specialisation below. @@ -411,7 +412,8 @@ std::ostream &operator<<(std::ostream &os, const Quantity &q) { // std::format("{:e}", qty) → "1.23457e+03 s" // std::format("{:.4e}", qty) → "1.2346e+03 s" // std::format("{:E}", qty) → "1.23457E+03 s" -// std::format("{:>15.2f}", qty) → " 1234.57 s" (number padded, not symbol) +// std::format("{:>15.2f}", qty) → " 1234.57 s" (number padded, not +// symbol) // // Note: width / fill / align specifications are applied to the numeric part // only; the unit symbol is always appended directly after without padding. @@ -422,15 +424,13 @@ std::ostream &operator<<(std::ostream &os, const Quantity &q) { namespace std { -template -struct formatter> { +template struct formatter> { private: std::formatter double_fmt_; public: /// Parse the format specification (e.g. ".2f", "e", ".4e"). - template - constexpr auto parse(ParseContext &ctx) { + template constexpr auto parse(ParseContext &ctx) { return double_fmt_.parse(ctx); } diff --git a/include/qtty/literals.hpp b/include/qtty/literals.hpp index 7d88c60..de3dbb4 100644 --- a/include/qtty/literals.hpp +++ b/include/qtty/literals.hpp @@ -1,10 +1,13 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once -#include "units/length.hpp" -#include "units/time.hpp" #include "units/angular.hpp" +#include "units/length.hpp" #include "units/mass.hpp" #include "units/power.hpp" +#include "units/time.hpp" namespace qtty { @@ -15,1019 +18,1019 @@ inline namespace literals { // Length literals // ==================== - constexpr PlanckLength operator""_l_P(long double value) { - return PlanckLength(static_cast(value)); + return PlanckLength(static_cast(value)); } constexpr PlanckLength operator""_l_P(unsigned long long value) { - return PlanckLength(static_cast(value)); + return PlanckLength(static_cast(value)); } constexpr Yoctometer operator""_ym(long double value) { - return Yoctometer(static_cast(value)); + return Yoctometer(static_cast(value)); } constexpr Yoctometer operator""_ym(unsigned long long value) { - return Yoctometer(static_cast(value)); + return Yoctometer(static_cast(value)); } constexpr Zeptometer operator""_zm(long double value) { - return Zeptometer(static_cast(value)); + return Zeptometer(static_cast(value)); } constexpr Zeptometer operator""_zm(unsigned long long value) { - return Zeptometer(static_cast(value)); + return Zeptometer(static_cast(value)); } constexpr Attometer operator""_am(long double value) { - return Attometer(static_cast(value)); + return Attometer(static_cast(value)); } constexpr Attometer operator""_am(unsigned long long value) { - return Attometer(static_cast(value)); + return Attometer(static_cast(value)); } constexpr Femtometer operator""_fm(long double value) { - return Femtometer(static_cast(value)); + return Femtometer(static_cast(value)); } constexpr Femtometer operator""_fm(unsigned long long value) { - return Femtometer(static_cast(value)); + return Femtometer(static_cast(value)); } constexpr Picometer operator""_pm(long double value) { - return Picometer(static_cast(value)); + return Picometer(static_cast(value)); } constexpr Picometer operator""_pm(unsigned long long value) { - return Picometer(static_cast(value)); + return Picometer(static_cast(value)); } constexpr Nanometer operator""_nm(long double value) { - return Nanometer(static_cast(value)); + return Nanometer(static_cast(value)); } constexpr Nanometer operator""_nm(unsigned long long value) { - return Nanometer(static_cast(value)); + return Nanometer(static_cast(value)); } constexpr Micrometer operator""_um(long double value) { - return Micrometer(static_cast(value)); + return Micrometer(static_cast(value)); } constexpr Micrometer operator""_um(unsigned long long value) { - return Micrometer(static_cast(value)); + return Micrometer(static_cast(value)); } constexpr Millimeter operator""_mm(long double value) { - return Millimeter(static_cast(value)); + return Millimeter(static_cast(value)); } constexpr Millimeter operator""_mm(unsigned long long value) { - return Millimeter(static_cast(value)); + return Millimeter(static_cast(value)); } constexpr Centimeter operator""_cm(long double value) { - return Centimeter(static_cast(value)); + return Centimeter(static_cast(value)); } constexpr Centimeter operator""_cm(unsigned long long value) { - return Centimeter(static_cast(value)); + return Centimeter(static_cast(value)); } constexpr Decimeter operator""_dm(long double value) { - return Decimeter(static_cast(value)); + return Decimeter(static_cast(value)); } constexpr Decimeter operator""_dm(unsigned long long value) { - return Decimeter(static_cast(value)); + return Decimeter(static_cast(value)); } constexpr Meter operator""_m(long double value) { - return Meter(static_cast(value)); + return Meter(static_cast(value)); } constexpr Meter operator""_m(unsigned long long value) { - return Meter(static_cast(value)); + return Meter(static_cast(value)); } constexpr Decameter operator""_dam(long double value) { - return Decameter(static_cast(value)); + return Decameter(static_cast(value)); } constexpr Decameter operator""_dam(unsigned long long value) { - return Decameter(static_cast(value)); + return Decameter(static_cast(value)); } constexpr Hectometer operator""_hm(long double value) { - return Hectometer(static_cast(value)); + return Hectometer(static_cast(value)); } constexpr Hectometer operator""_hm(unsigned long long value) { - return Hectometer(static_cast(value)); + return Hectometer(static_cast(value)); } constexpr Kilometer operator""_km(long double value) { - return Kilometer(static_cast(value)); + return Kilometer(static_cast(value)); } constexpr Kilometer operator""_km(unsigned long long value) { - return Kilometer(static_cast(value)); + return Kilometer(static_cast(value)); } constexpr Megameter operator""_Mm(long double value) { - return Megameter(static_cast(value)); + return Megameter(static_cast(value)); } constexpr Megameter operator""_Mm(unsigned long long value) { - return Megameter(static_cast(value)); + return Megameter(static_cast(value)); } constexpr Gigameter operator""_Gm(long double value) { - return Gigameter(static_cast(value)); + return Gigameter(static_cast(value)); } constexpr Gigameter operator""_Gm(unsigned long long value) { - return Gigameter(static_cast(value)); + return Gigameter(static_cast(value)); } constexpr Terameter operator""_Tm(long double value) { - return Terameter(static_cast(value)); + return Terameter(static_cast(value)); } constexpr Terameter operator""_Tm(unsigned long long value) { - return Terameter(static_cast(value)); + return Terameter(static_cast(value)); } constexpr Petameter operator""_Pm(long double value) { - return Petameter(static_cast(value)); + return Petameter(static_cast(value)); } constexpr Petameter operator""_Pm(unsigned long long value) { - return Petameter(static_cast(value)); + return Petameter(static_cast(value)); } constexpr Exameter operator""_Em(long double value) { - return Exameter(static_cast(value)); + return Exameter(static_cast(value)); } constexpr Exameter operator""_Em(unsigned long long value) { - return Exameter(static_cast(value)); + return Exameter(static_cast(value)); } constexpr Zettameter operator""_Zm(long double value) { - return Zettameter(static_cast(value)); + return Zettameter(static_cast(value)); } constexpr Zettameter operator""_Zm(unsigned long long value) { - return Zettameter(static_cast(value)); + return Zettameter(static_cast(value)); } constexpr Yottameter operator""_Ym(long double value) { - return Yottameter(static_cast(value)); + return Yottameter(static_cast(value)); } constexpr Yottameter operator""_Ym(unsigned long long value) { - return Yottameter(static_cast(value)); + return Yottameter(static_cast(value)); } constexpr BohrRadius operator""_a(long double value) { - return BohrRadius(static_cast(value)); + return BohrRadius(static_cast(value)); } constexpr BohrRadius operator""_a(unsigned long long value) { - return BohrRadius(static_cast(value)); + return BohrRadius(static_cast(value)); } constexpr ClassicalElectronRadius operator""_r_e(long double value) { - return ClassicalElectronRadius(static_cast(value)); + return ClassicalElectronRadius(static_cast(value)); } constexpr ClassicalElectronRadius operator""_r_e(unsigned long long value) { - return ClassicalElectronRadius(static_cast(value)); + return ClassicalElectronRadius(static_cast(value)); } constexpr ElectronReducedComptonWavelength operator""__e(long double value) { - return ElectronReducedComptonWavelength(static_cast(value)); + return ElectronReducedComptonWavelength(static_cast(value)); } -constexpr ElectronReducedComptonWavelength operator""__e(unsigned long long value) { - return ElectronReducedComptonWavelength(static_cast(value)); +constexpr ElectronReducedComptonWavelength +operator""__e(unsigned long long value) { + return ElectronReducedComptonWavelength(static_cast(value)); } constexpr AstronomicalUnit operator""_au(long double value) { - return AstronomicalUnit(static_cast(value)); + return AstronomicalUnit(static_cast(value)); } constexpr AstronomicalUnit operator""_au(unsigned long long value) { - return AstronomicalUnit(static_cast(value)); + return AstronomicalUnit(static_cast(value)); } constexpr LightYear operator""_ly(long double value) { - return LightYear(static_cast(value)); + return LightYear(static_cast(value)); } constexpr LightYear operator""_ly(unsigned long long value) { - return LightYear(static_cast(value)); + return LightYear(static_cast(value)); } constexpr Parsec operator""_pc(long double value) { - return Parsec(static_cast(value)); + return Parsec(static_cast(value)); } constexpr Parsec operator""_pc(unsigned long long value) { - return Parsec(static_cast(value)); + return Parsec(static_cast(value)); } constexpr Kiloparsec operator""_kpc(long double value) { - return Kiloparsec(static_cast(value)); + return Kiloparsec(static_cast(value)); } constexpr Kiloparsec operator""_kpc(unsigned long long value) { - return Kiloparsec(static_cast(value)); + return Kiloparsec(static_cast(value)); } constexpr Megaparsec operator""_Mpc(long double value) { - return Megaparsec(static_cast(value)); + return Megaparsec(static_cast(value)); } constexpr Megaparsec operator""_Mpc(unsigned long long value) { - return Megaparsec(static_cast(value)); + return Megaparsec(static_cast(value)); } constexpr Gigaparsec operator""_Gpc(long double value) { - return Gigaparsec(static_cast(value)); + return Gigaparsec(static_cast(value)); } constexpr Gigaparsec operator""_Gpc(unsigned long long value) { - return Gigaparsec(static_cast(value)); + return Gigaparsec(static_cast(value)); } constexpr Inch operator""_in(long double value) { - return Inch(static_cast(value)); + return Inch(static_cast(value)); } constexpr Inch operator""_in(unsigned long long value) { - return Inch(static_cast(value)); + return Inch(static_cast(value)); } constexpr Foot operator""_ft(long double value) { - return Foot(static_cast(value)); + return Foot(static_cast(value)); } constexpr Foot operator""_ft(unsigned long long value) { - return Foot(static_cast(value)); + return Foot(static_cast(value)); } constexpr Yard operator""_yd(long double value) { - return Yard(static_cast(value)); + return Yard(static_cast(value)); } constexpr Yard operator""_yd(unsigned long long value) { - return Yard(static_cast(value)); + return Yard(static_cast(value)); } constexpr Mile operator""_mi(long double value) { - return Mile(static_cast(value)); + return Mile(static_cast(value)); } constexpr Mile operator""_mi(unsigned long long value) { - return Mile(static_cast(value)); + return Mile(static_cast(value)); } constexpr Link operator""_lk(long double value) { - return Link(static_cast(value)); + return Link(static_cast(value)); } constexpr Link operator""_lk(unsigned long long value) { - return Link(static_cast(value)); + return Link(static_cast(value)); } constexpr Fathom operator""_ftm(long double value) { - return Fathom(static_cast(value)); + return Fathom(static_cast(value)); } constexpr Fathom operator""_ftm(unsigned long long value) { - return Fathom(static_cast(value)); + return Fathom(static_cast(value)); } constexpr Rod operator""_rd(long double value) { - return Rod(static_cast(value)); + return Rod(static_cast(value)); } constexpr Rod operator""_rd(unsigned long long value) { - return Rod(static_cast(value)); + return Rod(static_cast(value)); } constexpr Chain operator""_ch(long double value) { - return Chain(static_cast(value)); + return Chain(static_cast(value)); } constexpr Chain operator""_ch(unsigned long long value) { - return Chain(static_cast(value)); + return Chain(static_cast(value)); } constexpr NauticalMile operator""_nmi(long double value) { - return NauticalMile(static_cast(value)); + return NauticalMile(static_cast(value)); } constexpr NauticalMile operator""_nmi(unsigned long long value) { - return NauticalMile(static_cast(value)); + return NauticalMile(static_cast(value)); } constexpr NominalLunarRadius operator""_R_moon(long double value) { - return NominalLunarRadius(static_cast(value)); + return NominalLunarRadius(static_cast(value)); } constexpr NominalLunarRadius operator""_R_moon(unsigned long long value) { - return NominalLunarRadius(static_cast(value)); + return NominalLunarRadius(static_cast(value)); } constexpr NominalLunarDistance operator""_LD(long double value) { - return NominalLunarDistance(static_cast(value)); + return NominalLunarDistance(static_cast(value)); } constexpr NominalLunarDistance operator""_LD(unsigned long long value) { - return NominalLunarDistance(static_cast(value)); + return NominalLunarDistance(static_cast(value)); } constexpr NominalEarthPolarRadius operator""_R_earthpol(long double value) { - return NominalEarthPolarRadius(static_cast(value)); + return NominalEarthPolarRadius(static_cast(value)); } -constexpr NominalEarthPolarRadius operator""_R_earthpol(unsigned long long value) { - return NominalEarthPolarRadius(static_cast(value)); +constexpr NominalEarthPolarRadius +operator""_R_earthpol(unsigned long long value) { + return NominalEarthPolarRadius(static_cast(value)); } constexpr NominalEarthRadius operator""_R_earth(long double value) { - return NominalEarthRadius(static_cast(value)); + return NominalEarthRadius(static_cast(value)); } constexpr NominalEarthRadius operator""_R_earth(unsigned long long value) { - return NominalEarthRadius(static_cast(value)); + return NominalEarthRadius(static_cast(value)); } constexpr NominalEarthEquatorialRadius operator""_R_eartheq(long double value) { - return NominalEarthEquatorialRadius(static_cast(value)); + return NominalEarthEquatorialRadius(static_cast(value)); } -constexpr NominalEarthEquatorialRadius operator""_R_eartheq(unsigned long long value) { - return NominalEarthEquatorialRadius(static_cast(value)); +constexpr NominalEarthEquatorialRadius +operator""_R_eartheq(unsigned long long value) { + return NominalEarthEquatorialRadius(static_cast(value)); } constexpr EarthMeridionalCircumference operator""_C_mer(long double value) { - return EarthMeridionalCircumference(static_cast(value)); + return EarthMeridionalCircumference(static_cast(value)); } -constexpr EarthMeridionalCircumference operator""_C_mer(unsigned long long value) { - return EarthMeridionalCircumference(static_cast(value)); +constexpr EarthMeridionalCircumference +operator""_C_mer(unsigned long long value) { + return EarthMeridionalCircumference(static_cast(value)); } constexpr EarthEquatorialCircumference operator""_C_eq(long double value) { - return EarthEquatorialCircumference(static_cast(value)); + return EarthEquatorialCircumference(static_cast(value)); } -constexpr EarthEquatorialCircumference operator""_C_eq(unsigned long long value) { - return EarthEquatorialCircumference(static_cast(value)); +constexpr EarthEquatorialCircumference +operator""_C_eq(unsigned long long value) { + return EarthEquatorialCircumference(static_cast(value)); } constexpr NominalJupiterRadius operator""_R_jupiter(long double value) { - return NominalJupiterRadius(static_cast(value)); + return NominalJupiterRadius(static_cast(value)); } constexpr NominalJupiterRadius operator""_R_jupiter(unsigned long long value) { - return NominalJupiterRadius(static_cast(value)); + return NominalJupiterRadius(static_cast(value)); } constexpr NominalSolarRadius operator""_R_sol(long double value) { - return NominalSolarRadius(static_cast(value)); + return NominalSolarRadius(static_cast(value)); } constexpr NominalSolarRadius operator""_R_sol(unsigned long long value) { - return NominalSolarRadius(static_cast(value)); + return NominalSolarRadius(static_cast(value)); } constexpr NominalSolarDiameter operator""_D_sol(long double value) { - return NominalSolarDiameter(static_cast(value)); + return NominalSolarDiameter(static_cast(value)); } constexpr NominalSolarDiameter operator""_D_sol(unsigned long long value) { - return NominalSolarDiameter(static_cast(value)); + return NominalSolarDiameter(static_cast(value)); } // ==================== // Time literals // ==================== - constexpr Attosecond operator""_as(long double value) { - return Attosecond(static_cast(value)); + return Attosecond(static_cast(value)); } constexpr Attosecond operator""_as(unsigned long long value) { - return Attosecond(static_cast(value)); + return Attosecond(static_cast(value)); } constexpr Femtosecond operator""_fs(long double value) { - return Femtosecond(static_cast(value)); + return Femtosecond(static_cast(value)); } constexpr Femtosecond operator""_fs(unsigned long long value) { - return Femtosecond(static_cast(value)); + return Femtosecond(static_cast(value)); } constexpr Picosecond operator""_ps(long double value) { - return Picosecond(static_cast(value)); + return Picosecond(static_cast(value)); } constexpr Picosecond operator""_ps(unsigned long long value) { - return Picosecond(static_cast(value)); + return Picosecond(static_cast(value)); } constexpr Nanosecond operator""_ns(long double value) { - return Nanosecond(static_cast(value)); + return Nanosecond(static_cast(value)); } constexpr Nanosecond operator""_ns(unsigned long long value) { - return Nanosecond(static_cast(value)); + return Nanosecond(static_cast(value)); } constexpr Microsecond operator""_us(long double value) { - return Microsecond(static_cast(value)); + return Microsecond(static_cast(value)); } constexpr Microsecond operator""_us(unsigned long long value) { - return Microsecond(static_cast(value)); + return Microsecond(static_cast(value)); } constexpr Millisecond operator""_ms(long double value) { - return Millisecond(static_cast(value)); + return Millisecond(static_cast(value)); } constexpr Millisecond operator""_ms(unsigned long long value) { - return Millisecond(static_cast(value)); + return Millisecond(static_cast(value)); } constexpr Centisecond operator""_cs(long double value) { - return Centisecond(static_cast(value)); + return Centisecond(static_cast(value)); } constexpr Centisecond operator""_cs(unsigned long long value) { - return Centisecond(static_cast(value)); + return Centisecond(static_cast(value)); } constexpr Decisecond operator""_ds(long double value) { - return Decisecond(static_cast(value)); + return Decisecond(static_cast(value)); } constexpr Decisecond operator""_ds(unsigned long long value) { - return Decisecond(static_cast(value)); + return Decisecond(static_cast(value)); } constexpr Second operator""_s(long double value) { - return Second(static_cast(value)); + return Second(static_cast(value)); } constexpr Second operator""_s(unsigned long long value) { - return Second(static_cast(value)); + return Second(static_cast(value)); } constexpr Decasecond operator""_das(long double value) { - return Decasecond(static_cast(value)); + return Decasecond(static_cast(value)); } constexpr Decasecond operator""_das(unsigned long long value) { - return Decasecond(static_cast(value)); + return Decasecond(static_cast(value)); } constexpr Hectosecond operator""_hs(long double value) { - return Hectosecond(static_cast(value)); + return Hectosecond(static_cast(value)); } constexpr Hectosecond operator""_hs(unsigned long long value) { - return Hectosecond(static_cast(value)); + return Hectosecond(static_cast(value)); } constexpr Kilosecond operator""_ks(long double value) { - return Kilosecond(static_cast(value)); + return Kilosecond(static_cast(value)); } constexpr Kilosecond operator""_ks(unsigned long long value) { - return Kilosecond(static_cast(value)); + return Kilosecond(static_cast(value)); } constexpr Megasecond operator""_Ms(long double value) { - return Megasecond(static_cast(value)); + return Megasecond(static_cast(value)); } constexpr Megasecond operator""_Ms(unsigned long long value) { - return Megasecond(static_cast(value)); + return Megasecond(static_cast(value)); } constexpr Gigasecond operator""_Gs(long double value) { - return Gigasecond(static_cast(value)); + return Gigasecond(static_cast(value)); } constexpr Gigasecond operator""_Gs(unsigned long long value) { - return Gigasecond(static_cast(value)); + return Gigasecond(static_cast(value)); } constexpr Terasecond operator""_Ts(long double value) { - return Terasecond(static_cast(value)); + return Terasecond(static_cast(value)); } constexpr Terasecond operator""_Ts(unsigned long long value) { - return Terasecond(static_cast(value)); + return Terasecond(static_cast(value)); } constexpr Minute operator""_min(long double value) { - return Minute(static_cast(value)); + return Minute(static_cast(value)); } constexpr Minute operator""_min(unsigned long long value) { - return Minute(static_cast(value)); + return Minute(static_cast(value)); } constexpr Hour operator""_h(long double value) { - return Hour(static_cast(value)); + return Hour(static_cast(value)); } constexpr Hour operator""_h(unsigned long long value) { - return Hour(static_cast(value)); + return Hour(static_cast(value)); } constexpr Day operator""_d(long double value) { - return Day(static_cast(value)); + return Day(static_cast(value)); } constexpr Day operator""_d(unsigned long long value) { - return Day(static_cast(value)); + return Day(static_cast(value)); } constexpr Week operator""_wk(long double value) { - return Week(static_cast(value)); + return Week(static_cast(value)); } constexpr Week operator""_wk(unsigned long long value) { - return Week(static_cast(value)); + return Week(static_cast(value)); } constexpr Fortnight operator""_fn(long double value) { - return Fortnight(static_cast(value)); + return Fortnight(static_cast(value)); } constexpr Fortnight operator""_fn(unsigned long long value) { - return Fortnight(static_cast(value)); + return Fortnight(static_cast(value)); } constexpr Year operator""_yr(long double value) { - return Year(static_cast(value)); + return Year(static_cast(value)); } constexpr Year operator""_yr(unsigned long long value) { - return Year(static_cast(value)); + return Year(static_cast(value)); } constexpr Decade operator""_dec(long double value) { - return Decade(static_cast(value)); + return Decade(static_cast(value)); } constexpr Decade operator""_dec(unsigned long long value) { - return Decade(static_cast(value)); + return Decade(static_cast(value)); } constexpr Century operator""_c(long double value) { - return Century(static_cast(value)); + return Century(static_cast(value)); } constexpr Century operator""_c(unsigned long long value) { - return Century(static_cast(value)); + return Century(static_cast(value)); } constexpr Millennium operator""_mill(long double value) { - return Millennium(static_cast(value)); + return Millennium(static_cast(value)); } constexpr Millennium operator""_mill(unsigned long long value) { - return Millennium(static_cast(value)); + return Millennium(static_cast(value)); } constexpr JulianCentury operator""_jc(long double value) { - return JulianCentury(static_cast(value)); + return JulianCentury(static_cast(value)); } constexpr JulianCentury operator""_jc(unsigned long long value) { - return JulianCentury(static_cast(value)); + return JulianCentury(static_cast(value)); } constexpr SiderealDay operator""_sd(long double value) { - return SiderealDay(static_cast(value)); + return SiderealDay(static_cast(value)); } constexpr SiderealDay operator""_sd(unsigned long long value) { - return SiderealDay(static_cast(value)); + return SiderealDay(static_cast(value)); } constexpr SynodicMonth operator""_mo_s(long double value) { - return SynodicMonth(static_cast(value)); + return SynodicMonth(static_cast(value)); } constexpr SynodicMonth operator""_mo_s(unsigned long long value) { - return SynodicMonth(static_cast(value)); + return SynodicMonth(static_cast(value)); } constexpr SiderealYear operator""_yr_s(long double value) { - return SiderealYear(static_cast(value)); + return SiderealYear(static_cast(value)); } constexpr SiderealYear operator""_yr_s(unsigned long long value) { - return SiderealYear(static_cast(value)); + return SiderealYear(static_cast(value)); } // ==================== // Angle literals // ==================== - constexpr Milliradian operator""_mrad(long double value) { - return Milliradian(static_cast(value)); + return Milliradian(static_cast(value)); } constexpr Milliradian operator""_mrad(unsigned long long value) { - return Milliradian(static_cast(value)); + return Milliradian(static_cast(value)); } constexpr Radian operator""_rad(long double value) { - return Radian(static_cast(value)); + return Radian(static_cast(value)); } constexpr Radian operator""_rad(unsigned long long value) { - return Radian(static_cast(value)); + return Radian(static_cast(value)); } constexpr MicroArcsecond operator""_uas(long double value) { - return MicroArcsecond(static_cast(value)); + return MicroArcsecond(static_cast(value)); } constexpr MicroArcsecond operator""_uas(unsigned long long value) { - return MicroArcsecond(static_cast(value)); + return MicroArcsecond(static_cast(value)); } constexpr MilliArcsecond operator""_mas(long double value) { - return MilliArcsecond(static_cast(value)); + return MilliArcsecond(static_cast(value)); } constexpr MilliArcsecond operator""_mas(unsigned long long value) { - return MilliArcsecond(static_cast(value)); + return MilliArcsecond(static_cast(value)); } constexpr Arcsecond operator""_arcsec(long double value) { - return Arcsecond(static_cast(value)); + return Arcsecond(static_cast(value)); } constexpr Arcsecond operator""_arcsec(unsigned long long value) { - return Arcsecond(static_cast(value)); + return Arcsecond(static_cast(value)); } constexpr Arcminute operator""_arcmin(long double value) { - return Arcminute(static_cast(value)); + return Arcminute(static_cast(value)); } constexpr Arcminute operator""_arcmin(unsigned long long value) { - return Arcminute(static_cast(value)); + return Arcminute(static_cast(value)); } constexpr Degree operator""_deg(long double value) { - return Degree(static_cast(value)); + return Degree(static_cast(value)); } constexpr Degree operator""_deg(unsigned long long value) { - return Degree(static_cast(value)); + return Degree(static_cast(value)); } constexpr Gradian operator""_gon(long double value) { - return Gradian(static_cast(value)); + return Gradian(static_cast(value)); } constexpr Gradian operator""_gon(unsigned long long value) { - return Gradian(static_cast(value)); + return Gradian(static_cast(value)); } constexpr Turn operator""_tr(long double value) { - return Turn(static_cast(value)); + return Turn(static_cast(value)); } constexpr Turn operator""_tr(unsigned long long value) { - return Turn(static_cast(value)); + return Turn(static_cast(value)); } // ==================== // Mass literals // ==================== - constexpr Yoctogram operator""_yg(long double value) { - return Yoctogram(static_cast(value)); + return Yoctogram(static_cast(value)); } constexpr Yoctogram operator""_yg(unsigned long long value) { - return Yoctogram(static_cast(value)); + return Yoctogram(static_cast(value)); } constexpr Zeptogram operator""_zg(long double value) { - return Zeptogram(static_cast(value)); + return Zeptogram(static_cast(value)); } constexpr Zeptogram operator""_zg(unsigned long long value) { - return Zeptogram(static_cast(value)); + return Zeptogram(static_cast(value)); } constexpr Attogram operator""_ag(long double value) { - return Attogram(static_cast(value)); + return Attogram(static_cast(value)); } constexpr Attogram operator""_ag(unsigned long long value) { - return Attogram(static_cast(value)); + return Attogram(static_cast(value)); } constexpr Femtogram operator""_fg(long double value) { - return Femtogram(static_cast(value)); + return Femtogram(static_cast(value)); } constexpr Femtogram operator""_fg(unsigned long long value) { - return Femtogram(static_cast(value)); + return Femtogram(static_cast(value)); } constexpr Picogram operator""_pg(long double value) { - return Picogram(static_cast(value)); + return Picogram(static_cast(value)); } constexpr Picogram operator""_pg(unsigned long long value) { - return Picogram(static_cast(value)); + return Picogram(static_cast(value)); } constexpr Nanogram operator""_ng(long double value) { - return Nanogram(static_cast(value)); + return Nanogram(static_cast(value)); } constexpr Nanogram operator""_ng(unsigned long long value) { - return Nanogram(static_cast(value)); + return Nanogram(static_cast(value)); } constexpr Microgram operator""_ug(long double value) { - return Microgram(static_cast(value)); + return Microgram(static_cast(value)); } constexpr Microgram operator""_ug(unsigned long long value) { - return Microgram(static_cast(value)); + return Microgram(static_cast(value)); } constexpr Milligram operator""_mg(long double value) { - return Milligram(static_cast(value)); + return Milligram(static_cast(value)); } constexpr Milligram operator""_mg(unsigned long long value) { - return Milligram(static_cast(value)); + return Milligram(static_cast(value)); } constexpr Centigram operator""_cg(long double value) { - return Centigram(static_cast(value)); + return Centigram(static_cast(value)); } constexpr Centigram operator""_cg(unsigned long long value) { - return Centigram(static_cast(value)); + return Centigram(static_cast(value)); } constexpr Decigram operator""_dg(long double value) { - return Decigram(static_cast(value)); + return Decigram(static_cast(value)); } constexpr Decigram operator""_dg(unsigned long long value) { - return Decigram(static_cast(value)); + return Decigram(static_cast(value)); } constexpr Gram operator""_g(long double value) { - return Gram(static_cast(value)); + return Gram(static_cast(value)); } constexpr Gram operator""_g(unsigned long long value) { - return Gram(static_cast(value)); + return Gram(static_cast(value)); } constexpr Decagram operator""_dag(long double value) { - return Decagram(static_cast(value)); + return Decagram(static_cast(value)); } constexpr Decagram operator""_dag(unsigned long long value) { - return Decagram(static_cast(value)); + return Decagram(static_cast(value)); } constexpr Hectogram operator""_hg(long double value) { - return Hectogram(static_cast(value)); + return Hectogram(static_cast(value)); } constexpr Hectogram operator""_hg(unsigned long long value) { - return Hectogram(static_cast(value)); + return Hectogram(static_cast(value)); } constexpr Kilogram operator""_kg(long double value) { - return Kilogram(static_cast(value)); + return Kilogram(static_cast(value)); } constexpr Kilogram operator""_kg(unsigned long long value) { - return Kilogram(static_cast(value)); + return Kilogram(static_cast(value)); } constexpr Megagram operator""_Mg(long double value) { - return Megagram(static_cast(value)); + return Megagram(static_cast(value)); } constexpr Megagram operator""_Mg(unsigned long long value) { - return Megagram(static_cast(value)); + return Megagram(static_cast(value)); } constexpr Gigagram operator""_Gg(long double value) { - return Gigagram(static_cast(value)); + return Gigagram(static_cast(value)); } constexpr Gigagram operator""_Gg(unsigned long long value) { - return Gigagram(static_cast(value)); + return Gigagram(static_cast(value)); } constexpr Teragram operator""_Tg(long double value) { - return Teragram(static_cast(value)); + return Teragram(static_cast(value)); } constexpr Teragram operator""_Tg(unsigned long long value) { - return Teragram(static_cast(value)); + return Teragram(static_cast(value)); } constexpr Petagram operator""_Pg(long double value) { - return Petagram(static_cast(value)); + return Petagram(static_cast(value)); } constexpr Petagram operator""_Pg(unsigned long long value) { - return Petagram(static_cast(value)); + return Petagram(static_cast(value)); } constexpr Exagram operator""_Eg(long double value) { - return Exagram(static_cast(value)); + return Exagram(static_cast(value)); } constexpr Exagram operator""_Eg(unsigned long long value) { - return Exagram(static_cast(value)); + return Exagram(static_cast(value)); } constexpr Zettagram operator""_Zg(long double value) { - return Zettagram(static_cast(value)); + return Zettagram(static_cast(value)); } constexpr Zettagram operator""_Zg(unsigned long long value) { - return Zettagram(static_cast(value)); + return Zettagram(static_cast(value)); } constexpr Yottagram operator""_Yg(long double value) { - return Yottagram(static_cast(value)); + return Yottagram(static_cast(value)); } constexpr Yottagram operator""_Yg(unsigned long long value) { - return Yottagram(static_cast(value)); + return Yottagram(static_cast(value)); } constexpr Grain operator""_gr(long double value) { - return Grain(static_cast(value)); + return Grain(static_cast(value)); } constexpr Grain operator""_gr(unsigned long long value) { - return Grain(static_cast(value)); + return Grain(static_cast(value)); } constexpr Ounce operator""_oz(long double value) { - return Ounce(static_cast(value)); + return Ounce(static_cast(value)); } constexpr Ounce operator""_oz(unsigned long long value) { - return Ounce(static_cast(value)); + return Ounce(static_cast(value)); } constexpr Pound operator""_lb(long double value) { - return Pound(static_cast(value)); + return Pound(static_cast(value)); } constexpr Pound operator""_lb(unsigned long long value) { - return Pound(static_cast(value)); + return Pound(static_cast(value)); } constexpr Stone operator""_st(long double value) { - return Stone(static_cast(value)); + return Stone(static_cast(value)); } constexpr Stone operator""_st(unsigned long long value) { - return Stone(static_cast(value)); + return Stone(static_cast(value)); } constexpr ShortTon operator""_ton(long double value) { - return ShortTon(static_cast(value)); + return ShortTon(static_cast(value)); } constexpr ShortTon operator""_ton(unsigned long long value) { - return ShortTon(static_cast(value)); + return ShortTon(static_cast(value)); } constexpr LongTon operator""_ton_l(long double value) { - return LongTon(static_cast(value)); + return LongTon(static_cast(value)); } constexpr LongTon operator""_ton_l(unsigned long long value) { - return LongTon(static_cast(value)); + return LongTon(static_cast(value)); } constexpr Carat operator""_ct(long double value) { - return Carat(static_cast(value)); + return Carat(static_cast(value)); } constexpr Carat operator""_ct(unsigned long long value) { - return Carat(static_cast(value)); + return Carat(static_cast(value)); } constexpr Tonne operator""_t(long double value) { - return Tonne(static_cast(value)); + return Tonne(static_cast(value)); } constexpr Tonne operator""_t(unsigned long long value) { - return Tonne(static_cast(value)); + return Tonne(static_cast(value)); } constexpr AtomicMassUnit operator""_u(long double value) { - return AtomicMassUnit(static_cast(value)); + return AtomicMassUnit(static_cast(value)); } constexpr AtomicMassUnit operator""_u(unsigned long long value) { - return AtomicMassUnit(static_cast(value)); + return AtomicMassUnit(static_cast(value)); } constexpr SolarMass operator""_M_sol(long double value) { - return SolarMass(static_cast(value)); + return SolarMass(static_cast(value)); } constexpr SolarMass operator""_M_sol(unsigned long long value) { - return SolarMass(static_cast(value)); + return SolarMass(static_cast(value)); } // ==================== // Power literals // ==================== - constexpr Yoctowatt operator""_yW(long double value) { - return Yoctowatt(static_cast(value)); + return Yoctowatt(static_cast(value)); } constexpr Yoctowatt operator""_yW(unsigned long long value) { - return Yoctowatt(static_cast(value)); + return Yoctowatt(static_cast(value)); } constexpr Zeptowatt operator""_zW(long double value) { - return Zeptowatt(static_cast(value)); + return Zeptowatt(static_cast(value)); } constexpr Zeptowatt operator""_zW(unsigned long long value) { - return Zeptowatt(static_cast(value)); + return Zeptowatt(static_cast(value)); } constexpr Attowatt operator""_aW(long double value) { - return Attowatt(static_cast(value)); + return Attowatt(static_cast(value)); } constexpr Attowatt operator""_aW(unsigned long long value) { - return Attowatt(static_cast(value)); + return Attowatt(static_cast(value)); } constexpr Femtowatt operator""_fW(long double value) { - return Femtowatt(static_cast(value)); + return Femtowatt(static_cast(value)); } constexpr Femtowatt operator""_fW(unsigned long long value) { - return Femtowatt(static_cast(value)); + return Femtowatt(static_cast(value)); } constexpr Picowatt operator""_pW(long double value) { - return Picowatt(static_cast(value)); + return Picowatt(static_cast(value)); } constexpr Picowatt operator""_pW(unsigned long long value) { - return Picowatt(static_cast(value)); + return Picowatt(static_cast(value)); } constexpr Nanowatt operator""_nW(long double value) { - return Nanowatt(static_cast(value)); + return Nanowatt(static_cast(value)); } constexpr Nanowatt operator""_nW(unsigned long long value) { - return Nanowatt(static_cast(value)); + return Nanowatt(static_cast(value)); } constexpr Microwatt operator""_uW(long double value) { - return Microwatt(static_cast(value)); + return Microwatt(static_cast(value)); } constexpr Microwatt operator""_uW(unsigned long long value) { - return Microwatt(static_cast(value)); + return Microwatt(static_cast(value)); } constexpr Milliwatt operator""_mW(long double value) { - return Milliwatt(static_cast(value)); + return Milliwatt(static_cast(value)); } constexpr Milliwatt operator""_mW(unsigned long long value) { - return Milliwatt(static_cast(value)); + return Milliwatt(static_cast(value)); } constexpr Deciwatt operator""_dW(long double value) { - return Deciwatt(static_cast(value)); + return Deciwatt(static_cast(value)); } constexpr Deciwatt operator""_dW(unsigned long long value) { - return Deciwatt(static_cast(value)); + return Deciwatt(static_cast(value)); } constexpr Watt operator""_W(long double value) { - return Watt(static_cast(value)); + return Watt(static_cast(value)); } constexpr Watt operator""_W(unsigned long long value) { - return Watt(static_cast(value)); + return Watt(static_cast(value)); } constexpr Decawatt operator""_daW(long double value) { - return Decawatt(static_cast(value)); + return Decawatt(static_cast(value)); } constexpr Decawatt operator""_daW(unsigned long long value) { - return Decawatt(static_cast(value)); + return Decawatt(static_cast(value)); } constexpr Hectowatt operator""_hW(long double value) { - return Hectowatt(static_cast(value)); + return Hectowatt(static_cast(value)); } constexpr Hectowatt operator""_hW(unsigned long long value) { - return Hectowatt(static_cast(value)); + return Hectowatt(static_cast(value)); } constexpr Kilowatt operator""_kW(long double value) { - return Kilowatt(static_cast(value)); + return Kilowatt(static_cast(value)); } constexpr Kilowatt operator""_kW(unsigned long long value) { - return Kilowatt(static_cast(value)); + return Kilowatt(static_cast(value)); } constexpr Megawatt operator""_MW(long double value) { - return Megawatt(static_cast(value)); + return Megawatt(static_cast(value)); } constexpr Megawatt operator""_MW(unsigned long long value) { - return Megawatt(static_cast(value)); + return Megawatt(static_cast(value)); } constexpr Gigawatt operator""_GW(long double value) { - return Gigawatt(static_cast(value)); + return Gigawatt(static_cast(value)); } constexpr Gigawatt operator""_GW(unsigned long long value) { - return Gigawatt(static_cast(value)); + return Gigawatt(static_cast(value)); } constexpr Terawatt operator""_TW(long double value) { - return Terawatt(static_cast(value)); + return Terawatt(static_cast(value)); } constexpr Terawatt operator""_TW(unsigned long long value) { - return Terawatt(static_cast(value)); + return Terawatt(static_cast(value)); } constexpr Petawatt operator""_PW(long double value) { - return Petawatt(static_cast(value)); + return Petawatt(static_cast(value)); } constexpr Petawatt operator""_PW(unsigned long long value) { - return Petawatt(static_cast(value)); + return Petawatt(static_cast(value)); } constexpr Exawatt operator""_EW(long double value) { - return Exawatt(static_cast(value)); + return Exawatt(static_cast(value)); } constexpr Exawatt operator""_EW(unsigned long long value) { - return Exawatt(static_cast(value)); + return Exawatt(static_cast(value)); } constexpr Zettawatt operator""_ZW(long double value) { - return Zettawatt(static_cast(value)); + return Zettawatt(static_cast(value)); } constexpr Zettawatt operator""_ZW(unsigned long long value) { - return Zettawatt(static_cast(value)); + return Zettawatt(static_cast(value)); } constexpr Yottawatt operator""_YW(long double value) { - return Yottawatt(static_cast(value)); + return Yottawatt(static_cast(value)); } constexpr Yottawatt operator""_YW(unsigned long long value) { - return Yottawatt(static_cast(value)); + return Yottawatt(static_cast(value)); } constexpr ErgPerSecond operator""_erg_per_s(long double value) { - return ErgPerSecond(static_cast(value)); + return ErgPerSecond(static_cast(value)); } constexpr ErgPerSecond operator""_erg_per_s(unsigned long long value) { - return ErgPerSecond(static_cast(value)); + return ErgPerSecond(static_cast(value)); } constexpr HorsepowerMetric operator""_PS(long double value) { - return HorsepowerMetric(static_cast(value)); + return HorsepowerMetric(static_cast(value)); } constexpr HorsepowerMetric operator""_PS(unsigned long long value) { - return HorsepowerMetric(static_cast(value)); + return HorsepowerMetric(static_cast(value)); } constexpr HorsepowerElectric operator""_hp_e(long double value) { - return HorsepowerElectric(static_cast(value)); + return HorsepowerElectric(static_cast(value)); } constexpr HorsepowerElectric operator""_hp_e(unsigned long long value) { - return HorsepowerElectric(static_cast(value)); + return HorsepowerElectric(static_cast(value)); } constexpr SolarLuminosity operator""_L_sol(long double value) { - return SolarLuminosity(static_cast(value)); + return SolarLuminosity(static_cast(value)); } constexpr SolarLuminosity operator""_L_sol(unsigned long long value) { - return SolarLuminosity(static_cast(value)); + return SolarLuminosity(static_cast(value)); } } // namespace literals diff --git a/include/qtty/units/angular.hpp b/include/qtty/units/angular.hpp index dbe8eb2..5e0dbea 100644 --- a/include/qtty/units/angular.hpp +++ b/include/qtty/units/angular.hpp @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once #include "../ffi_core.hpp" @@ -15,45 +18,45 @@ struct GradianTag {}; struct TurnTag {}; struct HourAngleTag {}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIRADIAN; } - static constexpr std::string_view symbol() { return "mrad"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIRADIAN; } + static constexpr std::string_view symbol() { return "mrad"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_RADIAN; } - static constexpr std::string_view symbol() { return "rad"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_RADIAN; } + static constexpr std::string_view symbol() { return "rad"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICRO_ARCSECOND; } - static constexpr std::string_view symbol() { return "µas"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICRO_ARCSECOND; } + static constexpr std::string_view symbol() { return "µas"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLI_ARCSECOND; } - static constexpr std::string_view symbol() { return "mas"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLI_ARCSECOND; } + static constexpr std::string_view symbol() { return "mas"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ARCSECOND; } - static constexpr std::string_view symbol() { return "″"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ARCSECOND; } + static constexpr std::string_view symbol() { return "″"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ARCMINUTE; } - static constexpr std::string_view symbol() { return "′"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ARCMINUTE; } + static constexpr std::string_view symbol() { return "′"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DEGREE; } - static constexpr std::string_view symbol() { return "°"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DEGREE; } + static constexpr std::string_view symbol() { return "°"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRADIAN; } - static constexpr std::string_view symbol() { return "gon"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRADIAN; } + static constexpr std::string_view symbol() { return "gon"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TURN; } - static constexpr std::string_view symbol() { return "tr"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TURN; } + static constexpr std::string_view symbol() { return "tr"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HOUR_ANGLE; } - static constexpr std::string_view symbol() { return "ʰ"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HOUR_ANGLE; } + static constexpr std::string_view symbol() { return "ʰ"; } }; using Milliradian = Quantity; diff --git a/include/qtty/units/length.hpp b/include/qtty/units/length.hpp index 04d11b8..f0c629a 100644 --- a/include/qtty/units/length.hpp +++ b/include/qtty/units/length.hpp @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once #include "../ffi_core.hpp" @@ -55,205 +58,217 @@ struct NominalJupiterRadiusTag {}; struct NominalSolarRadiusTag {}; struct NominalSolarDiameterTag {}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PLANCK_LENGTH; } - static constexpr std::string_view symbol() { return "l_P"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOMETER; } - static constexpr std::string_view symbol() { return "ym"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOMETER; } - static constexpr std::string_view symbol() { return "zm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOMETER; } - static constexpr std::string_view symbol() { return "am"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOMETER; } - static constexpr std::string_view symbol() { return "fm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOMETER; } - static constexpr std::string_view symbol() { return "pm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOMETER; } - static constexpr std::string_view symbol() { return "nm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROMETER; } - static constexpr std::string_view symbol() { return "µm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIMETER; } - static constexpr std::string_view symbol() { return "mm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTIMETER; } - static constexpr std::string_view symbol() { return "cm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIMETER; } - static constexpr std::string_view symbol() { return "dm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_METER; } - static constexpr std::string_view symbol() { return "m"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAMETER; } - static constexpr std::string_view symbol() { return "dam"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOMETER; } - static constexpr std::string_view symbol() { return "hm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOMETER; } - static constexpr std::string_view symbol() { return "km"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAMETER; } - static constexpr std::string_view symbol() { return "Mm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAMETER; } - static constexpr std::string_view symbol() { return "Gm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAMETER; } - static constexpr std::string_view symbol() { return "Tm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAMETER; } - static constexpr std::string_view symbol() { return "Pm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAMETER; } - static constexpr std::string_view symbol() { return "Em"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAMETER; } - static constexpr std::string_view symbol() { return "Zm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAMETER; } - static constexpr std::string_view symbol() { return "Ym"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_BOHR_RADIUS; } - static constexpr std::string_view symbol() { return "a₀"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CLASSICAL_ELECTRON_RADIUS; } - static constexpr std::string_view symbol() { return "r_e"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ELECTRON_REDUCED_COMPTON_WAVELENGTH; } - static constexpr std::string_view symbol() { return "λ̄_e"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ASTRONOMICAL_UNIT; } - static constexpr std::string_view symbol() { return "au"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LIGHT_YEAR; } - static constexpr std::string_view symbol() { return "ly"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PARSEC; } - static constexpr std::string_view symbol() { return "pc"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOPARSEC; } - static constexpr std::string_view symbol() { return "kpc"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAPARSEC; } - static constexpr std::string_view symbol() { return "Mpc"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAPARSEC; } - static constexpr std::string_view symbol() { return "Gpc"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_INCH; } - static constexpr std::string_view symbol() { return "in"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FOOT; } - static constexpr std::string_view symbol() { return "ft"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YARD; } - static constexpr std::string_view symbol() { return "yd"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILE; } - static constexpr std::string_view symbol() { return "mi"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LINK; } - static constexpr std::string_view symbol() { return "lk"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FATHOM; } - static constexpr std::string_view symbol() { return "ftm"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ROD; } - static constexpr std::string_view symbol() { return "rd"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CHAIN; } - static constexpr std::string_view symbol() { return "ch"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NAUTICAL_MILE; } - static constexpr std::string_view symbol() { return "nmi"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_RADIUS; } - static constexpr std::string_view symbol() { return "R_☾"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_DISTANCE; } - static constexpr std::string_view symbol() { return "LD"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_POLAR_RADIUS; } - static constexpr std::string_view symbol() { return "R_⊕pol"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_RADIUS; } - static constexpr std::string_view symbol() { return "R_⊕"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_EQUATORIAL_RADIUS; } - static constexpr std::string_view symbol() { return "R_⊕eq"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EARTH_MERIDIONAL_CIRCUMFERENCE; } - static constexpr std::string_view symbol() { return "C_mer"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EARTH_EQUATORIAL_CIRCUMFERENCE; } - static constexpr std::string_view symbol() { return "C_eq"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_JUPITER_RADIUS; } - static constexpr std::string_view symbol() { return "R_♃"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_RADIUS; } - static constexpr std::string_view symbol() { return "R_☉"; } -}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_DIAMETER; } - static constexpr std::string_view symbol() { return "D_☉"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PLANCK_LENGTH; } + static constexpr std::string_view symbol() { return "l_P"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOMETER; } + static constexpr std::string_view symbol() { return "ym"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOMETER; } + static constexpr std::string_view symbol() { return "zm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOMETER; } + static constexpr std::string_view symbol() { return "am"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOMETER; } + static constexpr std::string_view symbol() { return "fm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOMETER; } + static constexpr std::string_view symbol() { return "pm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOMETER; } + static constexpr std::string_view symbol() { return "nm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROMETER; } + static constexpr std::string_view symbol() { return "µm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIMETER; } + static constexpr std::string_view symbol() { return "mm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTIMETER; } + static constexpr std::string_view symbol() { return "cm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIMETER; } + static constexpr std::string_view symbol() { return "dm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_METER; } + static constexpr std::string_view symbol() { return "m"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAMETER; } + static constexpr std::string_view symbol() { return "dam"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOMETER; } + static constexpr std::string_view symbol() { return "hm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOMETER; } + static constexpr std::string_view symbol() { return "km"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAMETER; } + static constexpr std::string_view symbol() { return "Mm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAMETER; } + static constexpr std::string_view symbol() { return "Gm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAMETER; } + static constexpr std::string_view symbol() { return "Tm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAMETER; } + static constexpr std::string_view symbol() { return "Pm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAMETER; } + static constexpr std::string_view symbol() { return "Em"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAMETER; } + static constexpr std::string_view symbol() { return "Zm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAMETER; } + static constexpr std::string_view symbol() { return "Ym"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_BOHR_RADIUS; } + static constexpr std::string_view symbol() { return "a₀"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_CLASSICAL_ELECTRON_RADIUS; + } + static constexpr std::string_view symbol() { return "r_e"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_ELECTRON_REDUCED_COMPTON_WAVELENGTH; + } + static constexpr std::string_view symbol() { return "λ̄_e"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ASTRONOMICAL_UNIT; } + static constexpr std::string_view symbol() { return "au"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LIGHT_YEAR; } + static constexpr std::string_view symbol() { return "ly"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PARSEC; } + static constexpr std::string_view symbol() { return "pc"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOPARSEC; } + static constexpr std::string_view symbol() { return "kpc"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAPARSEC; } + static constexpr std::string_view symbol() { return "Mpc"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAPARSEC; } + static constexpr std::string_view symbol() { return "Gpc"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_INCH; } + static constexpr std::string_view symbol() { return "in"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FOOT; } + static constexpr std::string_view symbol() { return "ft"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YARD; } + static constexpr std::string_view symbol() { return "yd"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILE; } + static constexpr std::string_view symbol() { return "mi"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LINK; } + static constexpr std::string_view symbol() { return "lk"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FATHOM; } + static constexpr std::string_view symbol() { return "ftm"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ROD; } + static constexpr std::string_view symbol() { return "rd"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CHAIN; } + static constexpr std::string_view symbol() { return "ch"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NAUTICAL_MILE; } + static constexpr std::string_view symbol() { return "nmi"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_RADIUS; } + static constexpr std::string_view symbol() { return "R_☾"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_LUNAR_DISTANCE; } + static constexpr std::string_view symbol() { return "LD"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_NOMINAL_EARTH_POLAR_RADIUS; + } + static constexpr std::string_view symbol() { return "R_⊕pol"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_EARTH_RADIUS; } + static constexpr std::string_view symbol() { return "R_⊕"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_NOMINAL_EARTH_EQUATORIAL_RADIUS; + } + static constexpr std::string_view symbol() { return "R_⊕eq"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_EARTH_MERIDIONAL_CIRCUMFERENCE; + } + static constexpr std::string_view symbol() { return "C_mer"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { + return UNIT_ID_EARTH_EQUATORIAL_CIRCUMFERENCE; + } + static constexpr std::string_view symbol() { return "C_eq"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_JUPITER_RADIUS; } + static constexpr std::string_view symbol() { return "R_♃"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_RADIUS; } + static constexpr std::string_view symbol() { return "R_☉"; } +}; +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NOMINAL_SOLAR_DIAMETER; } + static constexpr std::string_view symbol() { return "D_☉"; } }; using PlanckLength = Quantity; @@ -280,7 +295,8 @@ using Zettameter = Quantity; using Yottameter = Quantity; using BohrRadius = Quantity; using ClassicalElectronRadius = Quantity; -using ElectronReducedComptonWavelength = Quantity; +using ElectronReducedComptonWavelength = + Quantity; using AstronomicalUnit = Quantity; using LightYear = Quantity; using Parsec = Quantity; diff --git a/include/qtty/units/mass.hpp b/include/qtty/units/mass.hpp index dcc5841..c701cc3 100644 --- a/include/qtty/units/mass.hpp +++ b/include/qtty/units/mass.hpp @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once #include "../ffi_core.hpp" @@ -36,129 +39,129 @@ struct TonneTag {}; struct AtomicMassUnitTag {}; struct SolarMassTag {}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOGRAM; } - static constexpr std::string_view symbol() { return "yg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOGRAM; } + static constexpr std::string_view symbol() { return "yg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOGRAM; } - static constexpr std::string_view symbol() { return "zg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOGRAM; } + static constexpr std::string_view symbol() { return "zg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOGRAM; } - static constexpr std::string_view symbol() { return "ag"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOGRAM; } + static constexpr std::string_view symbol() { return "ag"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOGRAM; } - static constexpr std::string_view symbol() { return "fg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOGRAM; } + static constexpr std::string_view symbol() { return "fg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOGRAM; } - static constexpr std::string_view symbol() { return "pg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOGRAM; } + static constexpr std::string_view symbol() { return "pg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOGRAM; } - static constexpr std::string_view symbol() { return "ng"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOGRAM; } + static constexpr std::string_view symbol() { return "ng"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROGRAM; } - static constexpr std::string_view symbol() { return "µg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROGRAM; } + static constexpr std::string_view symbol() { return "µg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIGRAM; } - static constexpr std::string_view symbol() { return "mg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIGRAM; } + static constexpr std::string_view symbol() { return "mg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTIGRAM; } - static constexpr std::string_view symbol() { return "cg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTIGRAM; } + static constexpr std::string_view symbol() { return "cg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIGRAM; } - static constexpr std::string_view symbol() { return "dg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIGRAM; } + static constexpr std::string_view symbol() { return "dg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRAM; } - static constexpr std::string_view symbol() { return "g"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRAM; } + static constexpr std::string_view symbol() { return "g"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAGRAM; } - static constexpr std::string_view symbol() { return "dag"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAGRAM; } + static constexpr std::string_view symbol() { return "dag"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOGRAM; } - static constexpr std::string_view symbol() { return "hg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOGRAM; } + static constexpr std::string_view symbol() { return "hg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOGRAM; } - static constexpr std::string_view symbol() { return "kg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOGRAM; } + static constexpr std::string_view symbol() { return "kg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAGRAM; } - static constexpr std::string_view symbol() { return "Mg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAGRAM; } + static constexpr std::string_view symbol() { return "Mg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAGRAM; } - static constexpr std::string_view symbol() { return "Gg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAGRAM; } + static constexpr std::string_view symbol() { return "Gg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAGRAM; } - static constexpr std::string_view symbol() { return "Tg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAGRAM; } + static constexpr std::string_view symbol() { return "Tg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAGRAM; } - static constexpr std::string_view symbol() { return "Pg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAGRAM; } + static constexpr std::string_view symbol() { return "Pg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAGRAM; } - static constexpr std::string_view symbol() { return "Eg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAGRAM; } + static constexpr std::string_view symbol() { return "Eg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAGRAM; } - static constexpr std::string_view symbol() { return "Zg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAGRAM; } + static constexpr std::string_view symbol() { return "Zg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAGRAM; } - static constexpr std::string_view symbol() { return "Yg"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAGRAM; } + static constexpr std::string_view symbol() { return "Yg"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GRAIN; } - static constexpr std::string_view symbol() { return "gr"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GRAIN; } + static constexpr std::string_view symbol() { return "gr"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_OUNCE; } - static constexpr std::string_view symbol() { return "oz"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_OUNCE; } + static constexpr std::string_view symbol() { return "oz"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_POUND; } - static constexpr std::string_view symbol() { return "lb"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_POUND; } + static constexpr std::string_view symbol() { return "lb"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_STONE; } - static constexpr std::string_view symbol() { return "st"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_STONE; } + static constexpr std::string_view symbol() { return "st"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SHORT_TON; } - static constexpr std::string_view symbol() { return "ton"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SHORT_TON; } + static constexpr std::string_view symbol() { return "ton"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_LONG_TON; } - static constexpr std::string_view symbol() { return "ton_l"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_LONG_TON; } + static constexpr std::string_view symbol() { return "ton_l"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CARAT; } - static constexpr std::string_view symbol() { return "ct"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CARAT; } + static constexpr std::string_view symbol() { return "ct"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TONNE; } - static constexpr std::string_view symbol() { return "t"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TONNE; } + static constexpr std::string_view symbol() { return "t"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATOMIC_MASS_UNIT; } - static constexpr std::string_view symbol() { return "u"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATOMIC_MASS_UNIT; } + static constexpr std::string_view symbol() { return "u"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_MASS; } - static constexpr std::string_view symbol() { return "M_☉"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_MASS; } + static constexpr std::string_view symbol() { return "M_☉"; } }; using Yoctogram = Quantity; diff --git a/include/qtty/units/power.hpp b/include/qtty/units/power.hpp index 9015934..c9608bd 100644 --- a/include/qtty/units/power.hpp +++ b/include/qtty/units/power.hpp @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once #include "../ffi_core.hpp" @@ -29,101 +32,101 @@ struct HorsepowerMetricTag {}; struct HorsepowerElectricTag {}; struct SolarLuminosityTag {}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOCTOWATT; } - static constexpr std::string_view symbol() { return "yW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOCTOWATT; } + static constexpr std::string_view symbol() { return "yW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOWATT; } - static constexpr std::string_view symbol() { return "zW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZEPTOWATT; } + static constexpr std::string_view symbol() { return "zW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOWATT; } - static constexpr std::string_view symbol() { return "aW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOWATT; } + static constexpr std::string_view symbol() { return "aW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOWATT; } - static constexpr std::string_view symbol() { return "fW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOWATT; } + static constexpr std::string_view symbol() { return "fW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOWATT; } - static constexpr std::string_view symbol() { return "pW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOWATT; } + static constexpr std::string_view symbol() { return "pW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOWATT; } - static constexpr std::string_view symbol() { return "nW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOWATT; } + static constexpr std::string_view symbol() { return "nW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROWATT; } - static constexpr std::string_view symbol() { return "µW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROWATT; } + static constexpr std::string_view symbol() { return "µW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLIWATT; } - static constexpr std::string_view symbol() { return "mW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLIWATT; } + static constexpr std::string_view symbol() { return "mW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECIWATT; } - static constexpr std::string_view symbol() { return "dW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECIWATT; } + static constexpr std::string_view symbol() { return "dW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_WATT; } - static constexpr std::string_view symbol() { return "W"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_WATT; } + static constexpr std::string_view symbol() { return "W"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECAWATT; } - static constexpr std::string_view symbol() { return "daW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECAWATT; } + static constexpr std::string_view symbol() { return "daW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOWATT; } - static constexpr std::string_view symbol() { return "hW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOWATT; } + static constexpr std::string_view symbol() { return "hW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOWATT; } - static constexpr std::string_view symbol() { return "kW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOWATT; } + static constexpr std::string_view symbol() { return "kW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGAWATT; } - static constexpr std::string_view symbol() { return "MW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGAWATT; } + static constexpr std::string_view symbol() { return "MW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGAWATT; } - static constexpr std::string_view symbol() { return "GW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGAWATT; } + static constexpr std::string_view symbol() { return "GW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERAWATT; } - static constexpr std::string_view symbol() { return "TW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERAWATT; } + static constexpr std::string_view symbol() { return "TW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PETAWATT; } - static constexpr std::string_view symbol() { return "PW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PETAWATT; } + static constexpr std::string_view symbol() { return "PW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_EXAWATT; } - static constexpr std::string_view symbol() { return "EW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_EXAWATT; } + static constexpr std::string_view symbol() { return "EW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ZETTAWATT; } - static constexpr std::string_view symbol() { return "ZW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ZETTAWATT; } + static constexpr std::string_view symbol() { return "ZW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YOTTAWATT; } - static constexpr std::string_view symbol() { return "YW"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YOTTAWATT; } + static constexpr std::string_view symbol() { return "YW"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ERG_PER_SECOND; } - static constexpr std::string_view symbol() { return "erg/s"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ERG_PER_SECOND; } + static constexpr std::string_view symbol() { return "erg/s"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_METRIC; } - static constexpr std::string_view symbol() { return "PS"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_METRIC; } + static constexpr std::string_view symbol() { return "PS"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_ELECTRIC; } - static constexpr std::string_view symbol() { return "hp_e"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HORSEPOWER_ELECTRIC; } + static constexpr std::string_view symbol() { return "hp_e"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_LUMINOSITY; } - static constexpr std::string_view symbol() { return "L_☉"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SOLAR_LUMINOSITY; } + static constexpr std::string_view symbol() { return "L_☉"; } }; using Yoctowatt = Quantity; diff --git a/include/qtty/units/time.hpp b/include/qtty/units/time.hpp index 6747186..b0d69b3 100644 --- a/include/qtty/units/time.hpp +++ b/include/qtty/units/time.hpp @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + #pragma once #include "../ffi_core.hpp" @@ -34,121 +37,121 @@ struct SiderealDayTag {}; struct SynodicMonthTag {}; struct SiderealYearTag {}; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_ATTOSECOND; } - static constexpr std::string_view symbol() { return "as"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_ATTOSECOND; } + static constexpr std::string_view symbol() { return "as"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FEMTOSECOND; } - static constexpr std::string_view symbol() { return "fs"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FEMTOSECOND; } + static constexpr std::string_view symbol() { return "fs"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_PICOSECOND; } - static constexpr std::string_view symbol() { return "ps"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_PICOSECOND; } + static constexpr std::string_view symbol() { return "ps"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_NANOSECOND; } - static constexpr std::string_view symbol() { return "ns"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_NANOSECOND; } + static constexpr std::string_view symbol() { return "ns"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MICROSECOND; } - static constexpr std::string_view symbol() { return "µs"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MICROSECOND; } + static constexpr std::string_view symbol() { return "µs"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLISECOND; } - static constexpr std::string_view symbol() { return "ms"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLISECOND; } + static constexpr std::string_view symbol() { return "ms"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTISECOND; } - static constexpr std::string_view symbol() { return "cs"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTISECOND; } + static constexpr std::string_view symbol() { return "cs"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECISECOND; } - static constexpr std::string_view symbol() { return "ds"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECISECOND; } + static constexpr std::string_view symbol() { return "ds"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SECOND; } - static constexpr std::string_view symbol() { return "s"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SECOND; } + static constexpr std::string_view symbol() { return "s"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECASECOND; } - static constexpr std::string_view symbol() { return "das"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECASECOND; } + static constexpr std::string_view symbol() { return "das"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HECTOSECOND; } - static constexpr std::string_view symbol() { return "hs"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HECTOSECOND; } + static constexpr std::string_view symbol() { return "hs"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_KILOSECOND; } - static constexpr std::string_view symbol() { return "ks"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_KILOSECOND; } + static constexpr std::string_view symbol() { return "ks"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MEGASECOND; } - static constexpr std::string_view symbol() { return "Ms"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MEGASECOND; } + static constexpr std::string_view symbol() { return "Ms"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_GIGASECOND; } - static constexpr std::string_view symbol() { return "Gs"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_GIGASECOND; } + static constexpr std::string_view symbol() { return "Gs"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_TERASECOND; } - static constexpr std::string_view symbol() { return "Ts"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_TERASECOND; } + static constexpr std::string_view symbol() { return "Ts"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MINUTE; } - static constexpr std::string_view symbol() { return "min"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MINUTE; } + static constexpr std::string_view symbol() { return "min"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_HOUR; } - static constexpr std::string_view symbol() { return "h"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_HOUR; } + static constexpr std::string_view symbol() { return "h"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DAY; } - static constexpr std::string_view symbol() { return "d"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DAY; } + static constexpr std::string_view symbol() { return "d"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_WEEK; } - static constexpr std::string_view symbol() { return "wk"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_WEEK; } + static constexpr std::string_view symbol() { return "wk"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_FORTNIGHT; } - static constexpr std::string_view symbol() { return "fn"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_FORTNIGHT; } + static constexpr std::string_view symbol() { return "fn"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_YEAR; } - static constexpr std::string_view symbol() { return "yr"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_YEAR; } + static constexpr std::string_view symbol() { return "yr"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_DECADE; } - static constexpr std::string_view symbol() { return "dec"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_DECADE; } + static constexpr std::string_view symbol() { return "dec"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_CENTURY; } - static constexpr std::string_view symbol() { return "c"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_CENTURY; } + static constexpr std::string_view symbol() { return "c"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_MILLENNIUM; } - static constexpr std::string_view symbol() { return "mill"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_MILLENNIUM; } + static constexpr std::string_view symbol() { return "mill"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_YEAR; } - static constexpr std::string_view symbol() { return "a"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_YEAR; } + static constexpr std::string_view symbol() { return "a"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_CENTURY; } - static constexpr std::string_view symbol() { return "jc"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_JULIAN_CENTURY; } + static constexpr std::string_view symbol() { return "jc"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_DAY; } - static constexpr std::string_view symbol() { return "sd"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_DAY; } + static constexpr std::string_view symbol() { return "sd"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SYNODIC_MONTH; } - static constexpr std::string_view symbol() { return "mo_s"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SYNODIC_MONTH; } + static constexpr std::string_view symbol() { return "mo_s"; } }; -template<> struct UnitTraits { - static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_YEAR; } - static constexpr std::string_view symbol() { return "yr_s"; } +template <> struct UnitTraits { + static constexpr UnitId unit_id() { return UNIT_ID_SIDEREAL_YEAR; } + static constexpr std::string_view symbol() { return "yr_s"; } }; using Attosecond = Quantity; diff --git a/qtty b/qtty index 27662c5..761c15d 160000 --- a/qtty +++ b/qtty @@ -1 +1 @@ -Subproject commit 27662c5465ff88963066c7ab5bec164bd8e8e095 +Subproject commit 761c15df2643e9c7656035e183476b9176d9dc8f diff --git a/run-ci-locally.sh b/run-ci-locally.sh new file mode 100755 index 0000000..4fa2077 --- /dev/null +++ b/run-ci-locally.sh @@ -0,0 +1,391 @@ +#!/usr/bin/env bash +set -euo pipefail + +# qtty-cpp C++ CI runner for local development +# This script mirrors the GitHub Actions CI workflow and can be run locally + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Options +RUN_ALL=false +RUN_LINT=false +RUN_BUILD=false +RUN_COVERAGE=false +SKIP_INSTALL=false +PARALLEL_LEVEL=2 + +# Default: run all +if [[ $# -eq 0 ]]; then + RUN_ALL=true +fi + +# Parse arguments +while [[ $# -gt 0 ]]; do + case "$1" in + all) + RUN_ALL=true + shift + ;; + lint) + RUN_LINT=true + shift + ;; + build) + RUN_BUILD=true + shift + ;; + test) + RUN_BUILD=true + shift + ;; + coverage) + RUN_COVERAGE=true + shift + ;; + --skip-install) + SKIP_INSTALL=true + shift + ;; + --parallel) + PARALLEL_LEVEL="$2" + shift 2 + ;; + --help|-h) + cat < /dev/null; then + return 1 + fi + return 0 +} + +# Check and install tools +if [[ "$SKIP_INSTALL" == "false" ]]; then + print_header "Checking/Installing build tools" + + # Check for cmake + if ! check_command cmake; then + print_warning "cmake not found, installing..." + sudo apt-get update + sudo apt-get install -y cmake + else + print_success "cmake found: $(cmake --version | head -1)" + fi + + # Check for ninja + if ! check_command ninja; then + print_warning "ninja-build not found, installing..." + sudo apt-get update + sudo apt-get install -y ninja-build + else + print_success "ninja found: $(ninja --version)" + fi + + # Check for clang-format (only needed for lint) + if [[ "$RUN_LINT" == "true" ]]; then + if ! check_command clang-format; then + print_warning "clang-format not found, installing clang-format-18..." + sudo apt-get update + wget -qO /tmp/llvm.sh https://apt.llvm.org/llvm.sh + sudo bash /tmp/llvm.sh 18 + sudo apt-get install -y clang-format-18 + sudo ln -sf /usr/bin/clang-format-18 /usr/local/bin/clang-format + rm -f /tmp/llvm.sh + else + print_success "clang-format found: $(clang-format --version | head -1)" + fi + + # Check for clang-tidy + if ! check_command clang-tidy; then + print_warning "clang-tidy not found, installing..." + sudo apt-get update + sudo apt-get install -y clang-tidy + else + print_success "clang-tidy found" + fi + fi + + # Check for gcovr (only needed for coverage) + if [[ "$RUN_COVERAGE" == "true" ]]; then + if ! check_command gcovr; then + print_warning "gcovr not found, installing..." + sudo apt-get update + sudo apt-get install -y gcovr + else + print_success "gcovr found: $(gcovr --version | head -1)" + fi + fi +fi + +# Check for Rust (needed for submodule validation) +if ! check_command rustc; then + print_error "Rust not found. Please install from https://rustup.rs/" + exit 1 +fi + +FAILED=() +PASSED=() + +# Show submodule status +print_header "Submodule Information" +git submodule status --recursive 2>/dev/null || true +if [[ -f qtty/Cargo.toml ]]; then + echo -e "${GREEN}✓${NC} qtty submodule OK" +else + print_error "qtty submodule missing (run: git submodule update --init --recursive)" + FAILED+=("submodules") +fi + +# Lint checks +if [[ "$RUN_LINT" == "true" ]]; then + print_header "Check: clang-format" + mapfile -t files < <(git ls-files '*.hpp' '*.cpp' 2>/dev/null || echo "") + + if [[ ${#files[@]} -eq 0 ]]; then + print_warning "No C++ files found (check git ls-files)" + else + if clang-format --dry-run --Werror "${files[@]}" 2>/dev/null; then + print_success "clang-format check passed" + PASSED+=("clang-format") + else + print_error "clang-format check failed" + print_warning "Run: clang-format -i \$(git ls-files '*.hpp' '*.cpp')" + FAILED+=("clang-format") + fi + fi + + print_header "Check: clang-tidy" + + # First configure to generate compile_commands.json + print_warning "Configuring CMake for compile commands..." + if cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=ON >/dev/null 2>&1; then + mapfile -t cpp_files < <(git ls-files '*.cpp' 2>/dev/null || echo "") + + if [[ ${#cpp_files[@]} -eq 0 ]]; then + print_warning "No C++ source files found (check git ls-files)" + else + tidy_failed=false + for file in "${cpp_files[@]}"; do + echo " Checking: $file" + if ! clang-tidy -p build --warnings-as-errors='*' "$file" 2>/dev/null; then + tidy_failed=true + fi + done + + if [[ "$tidy_failed" == "false" ]]; then + print_success "clang-tidy check passed" + PASSED+=("clang-tidy") + else + print_error "clang-tidy check failed" + FAILED+=("clang-tidy") + fi + fi + else + print_error "CMake configuration failed" + FAILED+=("clang-tidy") + fi +fi + +# Build and test +if [[ "$RUN_BUILD" == "true" ]]; then + print_header "Configure: CMake (build directory)" + + if cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=ON >/dev/null 2>&1; then + print_success "CMake configuration complete" + else + print_error "CMake configuration failed" + FAILED+=("cmake-config") + exit 1 + fi + + print_header "Build: test_ffi target" + + if CMAKE_BUILD_PARALLEL_LEVEL="$PARALLEL_LEVEL" cmake --build build --target test_ffi 2>&1 | tee /tmp/build.log | tail -20; then + if [[ -f build/test_ffi ]]; then + print_success "Build successful" + PASSED+=("build") + else + print_error "Build failed (test_ffi executable not found)" + FAILED+=("build") + fi + else + print_error "Build failed" + FAILED+=("build") + fi + + print_header "Test: ctest" + + if ctest --test-dir build --output-on-failure -L qtty_cpp; then + print_success "All tests passed" + PASSED+=("test") + else + print_error "Tests failed" + FAILED+=("test") + fi + + print_header "Build: Doxygen documentation" + if cmake --build build --target docs 2>&1 | tee /tmp/docs.log | tail -10; then + if [[ -d build/docs/html ]]; then + print_success "Documentation built (see build/docs/html/index.html)" + PASSED+=("docs") + else + print_warning "Documentation build skipped (doxygen may not be installed)" + fi + else + print_warning "Documentation build skipped or failed" + fi +fi + +# Coverage +if [[ "$RUN_COVERAGE" == "true" ]]; then + print_header "Configure: CMake (coverage build)" + + if cmake -S . -B build-coverage -G Ninja \ + -DQTTY_BUILD_DOCS=OFF \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_FLAGS="--coverage" \ + -DCMAKE_EXE_LINKER_FLAGS="--coverage" >/dev/null 2>&1; then + print_success "CMake configuration complete" + else + print_error "CMake configuration failed" + FAILED+=("coverage-config") + exit 1 + fi + + print_header "Build: test_ffi target (coverage)" + + if CMAKE_BUILD_PARALLEL_LEVEL="$PARALLEL_LEVEL" cmake --build build-coverage --target test_ffi >/dev/null 2>&1; then + print_success "Build complete" + else + print_error "Build failed" + FAILED+=("coverage-build") + exit 1 + fi + + print_header "Test: ctest (coverage)" + + if ctest --test-dir build-coverage --output-on-failure -L qtty_cpp >/dev/null 2>&1; then + print_success "All tests passed" + else + print_error "Tests failed" + FAILED+=("coverage-test") + exit 1 + fi + + print_header "Generate coverage reports" + + mkdir -p coverage_html + + if gcovr \ + --root . \ + --exclude 'build-coverage/.*' \ + --exclude 'qtty/.*' \ + --exclude 'tests/.*' \ + --exclude 'examples/.*' \ + --xml \ + --output coverage.xml >/dev/null 2>&1; then + print_success "Cobertura XML report generated" + else + print_error "Failed to generate Cobertura report" + FAILED+=("coverage-xml") + fi + + if gcovr \ + --root . \ + --exclude 'build-coverage/.*' \ + --exclude 'qtty/.*' \ + --exclude 'tests/.*' \ + --exclude 'examples/.*' \ + --html-details \ + --output coverage_html/index.html >/dev/null 2>&1; then + print_success "HTML coverage report generated (see coverage_html/index.html)" + PASSED+=("coverage") + else + print_error "Failed to generate HTML report" + FAILED+=("coverage-html") + fi +fi + +# Summary +print_header "CI Summary" +echo -e "${GREEN}Passed (${#PASSED[@]}):${NC}" +for check in "${PASSED[@]}"; do + echo " ✓ $check" +done + +if [[ ${#FAILED[@]} -gt 0 ]]; then + echo -e "\n${RED}Failed (${#FAILED[@]}):${NC}" + for check in "${FAILED[@]}"; do + echo " ✗ $check" + done + exit 1 +else + echo -e "\n${GREEN}All checks passed!${NC}\n" + exit 0 +fi diff --git a/tests/test_formatting.cpp b/tests/test_formatting.cpp index 0bc438f..e4212c5 100644 --- a/tests/test_formatting.cpp +++ b/tests/test_formatting.cpp @@ -15,9 +15,9 @@ * Rust `{}` → operator<< (default) / format(-1, QTTY_FMT_DEFAULT) * Rust `{:.2}` → std::setprecision(2) << std::fixed / format(2) * Rust `{:e}` → std::scientific / format(-1, QTTY_FMT_LOWER_EXP) - * Rust `{:.4e}` → std::scientific << std::setprecision(4) / format(4, QTTY_FMT_LOWER_EXP) - * Rust `{:E}` → format(-1, QTTY_FMT_UPPER_EXP) - * Rust `{:.4E}` → format(4, QTTY_FMT_UPPER_EXP) + * Rust `{:.4e}` → std::scientific << std::setprecision(4) / format(4, + * QTTY_FMT_LOWER_EXP) Rust `{:E}` → format(-1, QTTY_FMT_UPPER_EXP) Rust + * `{:.4E}` → format(4, QTTY_FMT_UPPER_EXP) */ #include "fixtures.hpp" @@ -28,8 +28,7 @@ // ─── Helper ───────────────────────────────────────────────────────────────── /// Stream a quantity with the given manipulators and return the string. -template -static std::string stream_qty(const Q &q) { +template static std::string stream_qty(const Q &q) { std::ostringstream oss; oss << q; return oss.str(); @@ -181,7 +180,8 @@ TEST_F(FormattingTest, FormatLargeValue) { EXPECT_EQ(m.format(2, QTTY_FMT_LOWER_EXP), "1.50e12 m"); } -// Verify format() with precision=2 matches operator<< with fixed+setprecision(2). +// Verify format() with precision=2 matches operator<< with +// fixed+setprecision(2). TEST_F(FormattingTest, FormatMatchesStream) { Second s(1234.56789); std::ostringstream oss;