From 7c7373427ed6c980f78ff7e5eb874387a910e9d7 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 3 Apr 2024 17:24:55 -0400 Subject: [PATCH] xo-unit: refactor: c_basis_power<> -> basis_power<> --- example/ex1/CMakeLists.txt | 1 + example/ex2/CMakeLists.txt | 1 + example/ex3/CMakeLists.txt | 1 + example/ex3/ex3.cpp | 1 - include/xo/unit/quantity.hpp | 2 +- utest/quantity.test.cpp | 95 ++++++++++++++++++++++++------------ 6 files changed, 69 insertions(+), 32 deletions(-) diff --git a/example/ex1/CMakeLists.txt b/example/ex1/CMakeLists.txt index 0d415a06..679f538f 100644 --- a/example/ex1/CMakeLists.txt +++ b/example/ex1/CMakeLists.txt @@ -10,5 +10,6 @@ xo_include_options2(${SELF_EXE}) # dependencies.. xo_self_dependency(${SELF_EXE} xo_unit) +xo_dependency(${SELF_EXE} reflect) # end CMakeLists.txt diff --git a/example/ex2/CMakeLists.txt b/example/ex2/CMakeLists.txt index fa98d33b..e762d370 100644 --- a/example/ex2/CMakeLists.txt +++ b/example/ex2/CMakeLists.txt @@ -10,5 +10,6 @@ xo_include_options2(${SELF_EXE}) # dependencies.. xo_self_dependency(${SELF_EXE} xo_unit) +xo_dependency(${SELF_EXE} reflect) # end CMakeLists.txt diff --git a/example/ex3/CMakeLists.txt b/example/ex3/CMakeLists.txt index e6f40fc1..8f78979b 100644 --- a/example/ex3/CMakeLists.txt +++ b/example/ex3/CMakeLists.txt @@ -10,5 +10,6 @@ xo_include_options2(${SELF_EXE}) # dependencies.. xo_self_dependency(${SELF_EXE} xo_unit) +xo_dependency(${SELF_EXE} reflect) # end CMakeLists.txt diff --git a/example/ex3/ex3.cpp b/example/ex3/ex3.cpp index 77fcf03e..61a1d49c 100644 --- a/example/ex3/ex3.cpp +++ b/example/ex3/ex3.cpp @@ -7,7 +7,6 @@ int main () { namespace u = xo::unit::units; namespace qty = xo::unit::qty; - using xo::unit::quantity; using namespace std; auto t1 = qty::milliseconds(1); diff --git a/include/xo/unit/quantity.hpp b/include/xo/unit/quantity.hpp index 38fa44d8..232583b4 100644 --- a/include/xo/unit/quantity.hpp +++ b/include/xo/unit/quantity.hpp @@ -63,7 +63,7 @@ namespace xo { * q.basis_power -> 0 **/ template - static constexpr PowerRepr c_basis_power = from_ratio::power_type>(); + static constexpr PowerRepr basis_power = from_ratio::power_type>(); /** @brief get scale value (relative to unit) (@ref scale_) **/ constexpr Repr scale() const { return scale_; } diff --git a/utest/quantity.test.cpp b/utest/quantity.test.cpp index 352ca2c5..75adba87 100644 --- a/utest/quantity.test.cpp +++ b/utest/quantity.test.cpp @@ -54,8 +54,8 @@ namespace xo { REQUIRE(t.scale() == 1); - static_assert(t.c_basis_power == 1); - static_assert(t.c_basis_power == 0); + static_assert(t.basis_power == 1); + static_assert(t.basis_power == 0); } /*TEST_CASE(quantity)*/ TEST_CASE("add1", "[quantity]") { @@ -74,8 +74,8 @@ namespace xo { CHECK(strcmp(sum.unit_cstr(), "s") == 0); static_assert(std::same_as); - static_assert(t1.c_basis_power == 1); - static_assert(t2.c_basis_power == 1); + static_assert(t1.basis_power == 1); + static_assert(t2.basis_power == 1); REQUIRE(sum.scale() == 3); @@ -95,7 +95,7 @@ namespace xo { auto m2 = minutes(2); { - static_assert(m2.c_basis_power == 1); + static_assert(m2.basis_power == 1); log && log(xtag("m2.scale", m2.scale()), xtag("m2.unit", m2.unit_cstr())); @@ -118,7 +118,7 @@ namespace xo { auto sum = t1 + t2; static_assert(std::same_as); - static_assert(sum.c_basis_power == 1); + static_assert(sum.basis_power == 1); log && log(xtag("t1.unit", t1.unit_cstr()), xtag("t2.unit", t2.unit_cstr())); log && log(xtag("sum.unit", sum.unit_cstr())); @@ -136,7 +136,7 @@ namespace xo { /* sum will take unit from lhs argument to + */ auto sum = t1 + t2; - static_assert(sum.c_basis_power == 1); + static_assert(sum.basis_power == 1); static_assert(std::same_as); REQUIRE(sum.scale() == 121); @@ -187,10 +187,10 @@ namespace xo { { q2 = q1; - static_assert(q1.c_basis_power == 1); - static_assert(q1.c_basis_power == -1); - static_assert(q2.c_basis_power == 1); - static_assert(q2.c_basis_power == -1); + static_assert(q1.basis_power == 1); + static_assert(q1.basis_power == -1); + static_assert(q2.basis_power == 1); + static_assert(q2.basis_power == -1); log && log(XTAG(q1), XTAG(q2)); @@ -249,7 +249,7 @@ namespace xo { { auto sum = vol_250d + vol_30d; - static_assert(sum.c_basis_power == -0.5); + static_assert(sum.basis_power == -0.5); log && log(XTAG(sum)); @@ -279,7 +279,7 @@ namespace xo { { auto r = q0 * q1; - static_assert(r.c_basis_power == 2); + static_assert(r.basis_power == 2); log && log(xtag("q0", q0), xtag("q1", q1), xtag("q0*q1", r)); log && log(xtag("r.type", Reflect::require()->canonical_name())); @@ -292,7 +292,7 @@ namespace xo { { auto r = q1 * q2; - static_assert(r.c_basis_power == 2); + static_assert(r.basis_power == 2); log && log(xtag("q1", q1), xtag("q2", q2), xtag("q1*q2", r)); log && log(xtag("r.type", Reflect::require()->canonical_name())); @@ -305,7 +305,7 @@ namespace xo { { auto r = q2 * q1; - static_assert(r.c_basis_power == 2); + static_assert(r.basis_power == 2); log && log(xtag("q1", q1), xtag("q2", q2), xtag("r=q2*q1", r)); log && log(xtag("r.type", Reflect::require()->canonical_name())); @@ -318,7 +318,7 @@ namespace xo { { auto r = q2 * 60; - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); static_assert(std::same_as); log && log(xtag("q2*60", r)); @@ -332,7 +332,7 @@ namespace xo { { auto r = q2 * 60U; - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); static_assert(std::same_as); log && log(xtag("q2*60U", r)); @@ -346,7 +346,7 @@ namespace xo { { auto r = (q2 * 60.5); - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); /* verify dimension */ static_assert(std::same_as); @@ -365,7 +365,7 @@ namespace xo { auto r = (q2 * 60.5f); /* verify dimension */ - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); static_assert(std::same_as); log && log(xtag("r.type", Reflect::require()->canonical_name())); @@ -378,7 +378,7 @@ namespace xo { { auto r = 60 * q2; - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); static_assert(std::same_as); log && log(xtag("60*q2", r)); @@ -394,7 +394,7 @@ namespace xo { auto r = 60.5 * q2; - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); log && log(xtag("r.type", Reflect::require()->canonical_name())); static_assert(std::same_as); @@ -409,7 +409,7 @@ namespace xo { auto r = 60.5f * q2; - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); static_assert(std::same_as); log && log(xtag("r.type", Reflect::require()->canonical_name())); @@ -475,7 +475,7 @@ namespace xo { log && log(XTAG(q0), xtag("r1=1.0/q0", r1)); /* verify dimension */ - static_assert(r1.c_basis_power == -1); + static_assert(r1.basis_power == -1); /* verify scale */ REQUIRE(r1.scale() == 0.2); @@ -529,7 +529,7 @@ namespace xo { log && log(xtag("r.type", Reflect::require()->canonical_name())); /* verify dimension */ - static_assert(r.c_basis_power == -1); + static_assert(r.basis_power == -1); /* verify scale */ REQUIRE(r.scale() == 0.0125); @@ -542,7 +542,7 @@ namespace xo { log && log(xtag("r.type", Reflect::require()->canonical_name())); /* verify dimension */ - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); /* verify scale */ REQUIRE(r.scale() == 1.25); @@ -597,7 +597,7 @@ namespace xo { log && log(xtag("r.type", Reflect::require()->canonical_name())); /* verify dimension */ - static_assert(r.c_basis_power == -1); + static_assert(r.basis_power == -1); /* verify scale */ REQUIRE(r.scale() == 0.0125); @@ -610,7 +610,7 @@ namespace xo { log && log(xtag("r.type", Reflect::require()->canonical_name())); /* verify dimension */ - static_assert(r.c_basis_power == 1); + static_assert(r.basis_power == 1); /* verify scale */ REQUIRE(r.scale() == 1.25); @@ -619,6 +619,8 @@ namespace xo { } /*TEST_CASE(div3)*/ TEST_CASE("div4", "[quantity]") { + /* test with exact scalefactor */ + constexpr bool c_debug_flag = false; // can get bits from /dev/random by uncommenting the 2nd line below @@ -630,6 +632,39 @@ namespace xo { scope log(XO_DEBUG2(c_debug_flag, "TEST_CASE.div4")); //log && log("(A)", xtag("foo", foo)); + auto q1 = milliseconds(1); + auto q2 = minutes(1); + + auto r = q1 / q2.with_repr(); + + /* 0.1/sqrt(30dy) ~ 0.288675/sqrt(250dy), + * so q1/q2 ~ 0.6928 + */ + + log && log(XTAG(q1), XTAG(q2), xtag("q1/q2", r)); + + /* verify dimensionless result */ + static_assert(std::same_as); + + /* verify scale of result */ + CHECK(r == Approx(0.00001666667).epsilon(1e-6)); + + } /*TEST_CASE(div4)*/ + + TEST_CASE("div5", "[quantity]") { + /* test with inexact scalefactor */ + + constexpr bool c_debug_flag = false; + + // can get bits from /dev/random by uncommenting the 2nd line below + //uint64_t seed = xxx; + //rng::Seed seed; + + //auto rng = xo::rng::xoshiro256ss(seed); + + scope log(XO_DEBUG2(c_debug_flag, "TEST_CASE.div5")); + //log && log("(A)", xtag("foo", foo)); + auto q1 = volatility250d(0.2); auto q2 = volatility30d(0.1); @@ -647,10 +682,10 @@ namespace xo { /* verify scale of result */ CHECK(r == Approx(0.692820323).epsilon(1e-6)); - } /*TEST_CASE(div4)*/ + } /*TEST_CASE(div5)*/ TEST_CASE("muldiv5", "[quantity]") { - constexpr bool c_debug_flag = true; + constexpr bool c_debug_flag = false; // can get bits from /dev/random by uncommenting the 2nd line below //uint64_t seed = xxx; @@ -682,7 +717,7 @@ namespace xo { /* verify scale of result */ //CHECK(r == Approx(0.692820323).epsilon(1e-6)); - } /*TEST_CASE(div4)*/ + } /*TEST_CASE(muldiv5)*/ } /*namespace ut*/ } /*namespace xo*/