diff --git a/include/xo/unit/basis_unit.hpp b/include/xo/unit/basis_unit.hpp index c45d7fda..f5311997 100644 --- a/include/xo/unit/basis_unit.hpp +++ b/include/xo/unit/basis_unit.hpp @@ -38,11 +38,70 @@ namespace xo { }; namespace bu { - constexpr basis_unit nanogram = basis_unit(dim::mass, scalefactor_ratio_type(1, 1000000000)); - constexpr basis_unit microgram = basis_unit(dim::mass, scalefactor_ratio_type(1, 1000000)); - constexpr basis_unit milligram = basis_unit(dim::mass, scalefactor_ratio_type(1, 1000)); - constexpr basis_unit gram = basis_unit(dim::mass, scalefactor_ratio_type(1, 1)); - constexpr basis_unit kilogram = basis_unit(dim::mass, scalefactor_ratio_type(1000, 1)); + // ----- mass ----- + + constexpr basis_unit picogram = basis_unit(dim::mass, scalefactor_ratio_type( 1, 1000000000000)); + constexpr basis_unit nanogram = basis_unit(dim::mass, scalefactor_ratio_type( 1, 1000000000)); + constexpr basis_unit microgram = basis_unit(dim::mass, scalefactor_ratio_type( 1, 1000000)); + constexpr basis_unit milligram = basis_unit(dim::mass, scalefactor_ratio_type( 1, 1000)); + constexpr basis_unit gram = basis_unit(dim::mass, scalefactor_ratio_type( 1, 1)); + constexpr basis_unit kilogram = basis_unit(dim::mass, scalefactor_ratio_type( 1000, 1)); + constexpr basis_unit tonne = basis_unit(dim::mass, scalefactor_ratio_type( 1000000, 1)); + constexpr basis_unit kilotonne = basis_unit(dim::mass, scalefactor_ratio_type( 1000000000, 1)); + constexpr basis_unit megatonne = basis_unit(dim::mass, scalefactor_ratio_type(1000000000000, 1)); + + // ----- distance ----- + + /* International spelling */ + constexpr basis_unit picometre = basis_unit(dim::distance, scalefactor_ratio_type( 1, 1000000000000)); + constexpr basis_unit nanometre = basis_unit(dim::distance, scalefactor_ratio_type( 1, 1000000000)); + constexpr basis_unit micrometre = basis_unit(dim::distance, scalefactor_ratio_type( 1, 1000000)); + constexpr basis_unit millimetre = basis_unit(dim::distance, scalefactor_ratio_type( 1, 1000)); + constexpr basis_unit metre = basis_unit(dim::distance, scalefactor_ratio_type( 1, 1)); + constexpr basis_unit kilometre = basis_unit(dim::distance, scalefactor_ratio_type( 1000, 1)); + constexpr basis_unit megametre = basis_unit(dim::distance, scalefactor_ratio_type( 1000000, 1)); + constexpr basis_unit gigametre = basis_unit(dim::distance, scalefactor_ratio_type( 1000000000, 1)); + + constexpr basis_unit lightsecond = basis_unit(dim::distance, scalefactor_ratio_type( 299792458, 1)); + constexpr basis_unit astronomicalunit = basis_unit(dim::distance, scalefactor_ratio_type( 149597870700, 1)); + + /* US spelling */ + constexpr basis_unit picometer = picometre; + constexpr basis_unit nanometer = nanometre; + constexpr basis_unit micrometer = micrometre; + constexpr basis_unit millimeter = millimetre; + constexpr basis_unit meter = metre; + constexpr basis_unit kilometer = kilometre; + + // ----- time ----- + + constexpr basis_unit picosecond = basis_unit(dim::time, scalefactor_ratio_type( 1, 1000000000000)); + constexpr basis_unit nanosecond = basis_unit(dim::time, scalefactor_ratio_type( 1, 1000000000)); + constexpr basis_unit microsecond = basis_unit(dim::time, scalefactor_ratio_type( 1, 1000000)); + constexpr basis_unit millisecond = basis_unit(dim::time, scalefactor_ratio_type( 1, 1000)); + constexpr basis_unit second = basis_unit(dim::time, scalefactor_ratio_type( 1, 1)); + constexpr basis_unit minute = basis_unit(dim::time, scalefactor_ratio_type( 60, 1)); + constexpr basis_unit hour = basis_unit(dim::time, scalefactor_ratio_type( 3600, 1)); + constexpr basis_unit day = basis_unit(dim::time, scalefactor_ratio_type( 24*3600, 1)); + constexpr basis_unit week = basis_unit(dim::time, scalefactor_ratio_type( 7*24*3600, 1)); + constexpr basis_unit month = basis_unit(dim::time, scalefactor_ratio_type( 30*24*3600, 1)); + constexpr basis_unit year = basis_unit(dim::time, scalefactor_ratio_type((365*24+6)*3600, 1)); + + /* alt conventions used in finance */ + constexpr basis_unit year365 = basis_unit(dim::time, scalefactor_ratio_type( 365*24*3600, 1)); + constexpr basis_unit year360 = basis_unit(dim::time, scalefactor_ratio_type( 360*24*3600, 1)); + /* 250 = approx number of trading days in a calendar year */ + constexpr basis_unit year250 = basis_unit(dim::time, scalefactor_ratio_type( 250*24*3600, 1)); + + // ----- currency ----- + + /* pseudounit -- placeholder for any actual currency amount */ + constexpr basis_unit currency = basis_unit(dim::currency, scalefactor_ratio_type( 1, 1)); + + // ----- price ----- + + /* psuedounit -- context-dependent interpretation */ + constexpr basis_unit price = basis_unit(dim::price, scalefactor_ratio_type( 1, 1)); } namespace units { @@ -84,6 +143,7 @@ namespace xo { native_unit2_v[static_cast(basis_dim)].abbrev_str()))); } +#ifdef NOT_USING template @@ -109,12 +169,12 @@ namespace xo { }; template <> - struct scaled_native_unit2_abbrev { + struct scaled_native_unit2_abbrev { static constexpr const basis_unit2_abbrev_type value = basis_unit2_abbrev_type::from_chars("ug"); }; template <> - struct scaled_native_unit2_abbrev { + struct scaled_native_unit2_abbrev { static constexpr const basis_unit2_abbrev_type value = basis_unit2_abbrev_type::from_chars("mg"); }; @@ -206,8 +266,10 @@ namespace xo { template constexpr auto scaled_native_unit2_abbrev_v = scaled_native_unit2_abbrev::value; +#endif } + } /*namespace qty*/ } /*namespace xo*/ diff --git a/include/xo/unit/basis_unit_abbrev.hpp b/include/xo/unit/basis_unit_abbrev.hpp index eee7dfda..31e39565 100644 --- a/include/xo/unit/basis_unit_abbrev.hpp +++ b/include/xo/unit/basis_unit_abbrev.hpp @@ -45,6 +45,8 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("ug"); case 1000000000: return basis_unit2_abbrev_type::from_chars("ng"); + case 1000000000000: + return basis_unit2_abbrev_type::from_chars("pg"); } } @@ -56,6 +58,8 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("t"); case 1000000000: return basis_unit2_abbrev_type::from_chars("kt"); + case 1000000000000: + return basis_unit2_abbrev_type::from_chars("Mt"); } } @@ -78,6 +82,8 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("um"); case 1000000000: return basis_unit2_abbrev_type::from_chars("nm"); + case 1000000000000: + return basis_unit2_abbrev_type::from_chars("pm"); } } @@ -87,8 +93,12 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("km"); case 1000000: return basis_unit2_abbrev_type::from_chars("Mm"); + case 299792458: + return basis_unit2_abbrev_type::from_chars("lsec"); case 1000000000: return basis_unit2_abbrev_type::from_chars("Gm"); + case 149597870700: + return basis_unit2_abbrev_type::from_chars("AU"); } } @@ -111,6 +121,8 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("us"); case 1000000000: return basis_unit2_abbrev_type::from_chars("ns"); + case 1000000000000: + return basis_unit2_abbrev_type::from_chars("ps"); } } @@ -132,6 +144,8 @@ namespace xo { return basis_unit2_abbrev_type::from_chars("yr360"); case 365*24*3600: return basis_unit2_abbrev_type::from_chars("yr365"); + case 365*24*3600+6*3600: + return basis_unit2_abbrev_type::from_chars("yr"); } } @@ -161,7 +175,7 @@ namespace xo { if (scalefactor.num() == 1) { switch(scalefactor.den()) { case 1: - return basis_unit2_abbrev_type::from_chars("ccy"); + return basis_unit2_abbrev_type::from_chars("px"); } } diff --git a/include/xo/unit/bpu_store.hpp b/include/xo/unit/bpu_store.hpp index eed8c199..04cb086e 100644 --- a/include/xo/unit/bpu_store.hpp +++ b/include/xo/unit/bpu_store.hpp @@ -80,7 +80,7 @@ namespace xo { this->bu_establish_abbrev (basis_unit(BasisDim, scalefactor_ratio_type(InnerScaleNum, InnerScaleDen)), - units::scaled_native_unit2_abbrev_v); + abbrev::basis_unit2_abbrev(BasisDim, scalefactor_ratio_type(InnerScaleNum, InnerScaleDen))); } /** @brief establish abbreviation @p abbrev for basis unit @p bu diff --git a/utest/unit.test.cpp b/utest/unit.test.cpp index 996441c1..c01f7c41 100644 --- a/utest/unit.test.cpp +++ b/utest/unit.test.cpp @@ -19,6 +19,7 @@ namespace xo { namespace ut { /* compile-time tests */ + namespace bu = xo::qty::bu; namespace su2 = xo::qty::su2; using xo::qty::Quantity; @@ -27,7 +28,7 @@ namespace xo { using xo::qty::native_unit2_v; using xo::qty::scalefactor_ratio_type; using xo::qty::units::scaled_native_unit2_abbrev; - using xo::qty::units::scaled_native_unit2_abbrev_v; + //using xo::qty::units::scaled_native_unit2_abbrev_v; using xo::qty::basis_unit; using xo::qty::abbrev::basis_unit2_abbrev;; using xo::qty::bpu_abbrev_type; @@ -84,67 +85,80 @@ namespace xo { log && log("---------------------"); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1, 1000000000)).abbrev() + /* note: using CHECK to make test show up in coverage */ + +# define REQUIRE_x2(x) static_assert(x); REQUIRE(x) + + REQUIRE_x2(bu::picogram.abbrev() == basis_unit2_abbrev_type::from_chars("pg")); + REQUIRE_x2(bu::nanogram.abbrev() == basis_unit2_abbrev_type::from_chars("ng")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1, 1000000)).abbrev() + REQUIRE_x2(bu::microgram.abbrev() == basis_unit2_abbrev_type::from_chars("ug")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1, 1000)).abbrev() + REQUIRE_x2(bu::milligram.abbrev() == basis_unit2_abbrev_type::from_chars("mg")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1, 1)).abbrev() + REQUIRE_x2(bu::gram.abbrev() == basis_unit2_abbrev_type::from_chars("g")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1000, 1)).abbrev() + REQUIRE_x2(bu::kilogram.abbrev() == basis_unit2_abbrev_type::from_chars("kg")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1000000, 1)).abbrev() + REQUIRE_x2(bu::tonne.abbrev() == basis_unit2_abbrev_type::from_chars("t")); - static_assert(basis_unit(dim::mass, scalefactor_ratio_type(1000000000, 1)).abbrev() + REQUIRE_x2(bu::kilotonne.abbrev() == basis_unit2_abbrev_type::from_chars("kt")); + REQUIRE_x2(bu::megatonne.abbrev() + == basis_unit2_abbrev_type::from_chars("Mt")); log && log(xtag("distance", basis_unit2_abbrev(dim::distance, scalefactor_ratio_type(1, 1)))); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1, 1000000000)).abbrev() + REQUIRE_x2(bu::picometre.abbrev() + == basis_unit2_abbrev_type::from_chars("pm")); + REQUIRE_x2(bu::nanometre.abbrev() == basis_unit2_abbrev_type::from_chars("nm")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1, 1000000)).abbrev() + REQUIRE_x2(bu::micrometre.abbrev() == basis_unit2_abbrev_type::from_chars("um")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1, 1000)).abbrev() + REQUIRE_x2(bu::millimetre.abbrev() == basis_unit2_abbrev_type::from_chars("mm")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1, 1)).abbrev() + REQUIRE_x2(bu::metre.abbrev() == basis_unit2_abbrev_type::from_chars("m")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1000, 1)).abbrev() + REQUIRE_x2(bu::kilometre.abbrev() == basis_unit2_abbrev_type::from_chars("km")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1000000, 1)).abbrev() + REQUIRE_x2(bu::megametre.abbrev() == basis_unit2_abbrev_type::from_chars("Mm")); - static_assert(basis_unit(dim::distance, scalefactor_ratio_type(1000000000, 1)).abbrev() + REQUIRE_x2(bu::gigametre.abbrev() == basis_unit2_abbrev_type::from_chars("Gm")); + REQUIRE_x2(bu::lightsecond.abbrev() == basis_unit2_abbrev_type::from_chars("lsec")); + REQUIRE_x2(bu::astronomicalunit.abbrev() == basis_unit2_abbrev_type::from_chars("AU")); + log && log(xtag("time", basis_unit2_abbrev(dim::time, scalefactor_ratio_type(1, 1)))); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(1, 1000000000)).abbrev() - == basis_unit2_abbrev_type::from_chars("ns")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(1, 1000000)).abbrev() - == basis_unit2_abbrev_type::from_chars("us")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(1, 1000000)).abbrev() - == basis_unit2_abbrev_type::from_chars("us")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(1, 1000)).abbrev() - == basis_unit2_abbrev_type::from_chars("ms")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(1, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("s")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(60, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("min")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("hr")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("dy")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(7*24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("wk")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(30*24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("mo")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(250*24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("yr250")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(360*24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("yr360")); - static_assert(basis_unit(dim::time, scalefactor_ratio_type(365*24*3600, 1)).abbrev() - == basis_unit2_abbrev_type::from_chars("yr365")); + REQUIRE_x2(bu::second.abbrev() == basis_unit2_abbrev_type::from_chars("s")); + REQUIRE_x2(bu::picosecond.abbrev() == basis_unit2_abbrev_type::from_chars("ps")); + REQUIRE_x2(bu::nanosecond.abbrev() == basis_unit2_abbrev_type::from_chars("ns")); + REQUIRE_x2(bu::microsecond.abbrev() == basis_unit2_abbrev_type::from_chars("us")); + REQUIRE_x2(bu::millisecond.abbrev() == basis_unit2_abbrev_type::from_chars("ms")); + REQUIRE_x2(bu::second.abbrev() == basis_unit2_abbrev_type::from_chars("s")); + REQUIRE_x2(bu::minute.abbrev() == basis_unit2_abbrev_type::from_chars("min")); + REQUIRE_x2(bu::hour.abbrev() == basis_unit2_abbrev_type::from_chars("hr")); + REQUIRE_x2(bu::day.abbrev() == basis_unit2_abbrev_type::from_chars("dy")); + REQUIRE_x2(bu::week.abbrev() == basis_unit2_abbrev_type::from_chars("wk")); + REQUIRE_x2(bu::month.abbrev() == basis_unit2_abbrev_type::from_chars("mo")); + REQUIRE_x2(bu::year.abbrev() == basis_unit2_abbrev_type::from_chars("yr")); + REQUIRE_x2(bu::year250.abbrev() == basis_unit2_abbrev_type::from_chars("yr250")); + REQUIRE_x2(bu::year360.abbrev() == basis_unit2_abbrev_type::from_chars("yr360")); + REQUIRE_x2(bu::year365.abbrev() == basis_unit2_abbrev_type::from_chars("yr365")); + + log && log(xtag("currency", basis_unit2_abbrev(dim::currency, scalefactor_ratio_type(1, 1)))); + + REQUIRE_x2(bu::currency.abbrev() == flatstring("ccy")); + + log && log(xtag("price", basis_unit2_abbrev(dim::price, scalefactor_ratio_type(1, 1)))); + + REQUIRE_x2(bu::price.abbrev() == flatstring("px")); + +# undef REQUIRE_x2 + +#ifdef OBSOLETE log && log("---------------------"); log && log(xtag("mass*10^-9", scaled_native_unit2_abbrev_v)); @@ -181,6 +195,7 @@ namespace xo { /* proof that scaled_native_unit2_abbrev::value is constexpr */ static_assert(scaled_native_unit2_abbrev_v == basis_unit2_abbrev_type::from_flatstring(xo::flatstring("g"))); +#endif } /*TEST_CASE(basis_unit)*/