xo-unit: refactor: basis_unit2_abbrev_type -> bu_abbrev_type

This commit is contained in:
Roland Conybeare 2024-05-08 11:02:14 -04:00
commit 5f20b53485
5 changed files with 119 additions and 97 deletions

View file

@ -31,7 +31,7 @@ namespace xo {
constexpr const scalefactor_ratio_type & scalefactor() const { return scalefactor_; }
///@}
constexpr basis_unit2_abbrev_type abbrev() const {
constexpr bu_abbrev_type abbrev() const {
return abbrev::basis_unit2_abbrev(native_dim_,
scalefactor_);
}
@ -192,20 +192,20 @@ namespace xo {
template <dim BasisDim>
struct scaled_native_unit2_abbrev<BasisDim, 1, 1> {
static constexpr const basis_unit2_abbrev_type value
= (basis_unit2_abbrev_type::from_flatstring
static constexpr const bu_abbrev_type value
= (bu_abbrev_type::from_flatstring
(native_unit2_v[static_cast<uint32_t>(BasisDim)]
.abbrev_str()));
};
inline
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
bu_fallback_abbrev(dim basis_dim,
const scalefactor_ratio_type & scalefactor)
{
return (basis_unit2_abbrev_type::from_flatstring
return (bu_abbrev_type::from_flatstring
(flatstring_concat
(scalefactor.to_str<basis_unit2_abbrev_type::fixed_capacity>(),
(scalefactor.to_str<bu_abbrev_type::fixed_capacity>(),
native_unit2_v[static_cast<std::uint32_t>(basis_dim)].abbrev_str())));
}
}

View file

@ -11,21 +11,21 @@
namespace xo {
namespace qty {
using basis_unit2_abbrev_type = flatstring<16>;
using bu_abbrev_type = flatstring<16>;
using scalefactor_ratio_type = xo::ratio::ratio<std::int64_t>;
namespace abbrev {
static
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
fallback_unit_abbrev(const scalefactor_ratio_type & scalefactor,
dimension native_dim)
{
/* e.g. unit of '1000 grams' will have abbrev '1000g' in absence
* of a specialization for scaled_native_unit_abbrev
*/
return (basis_unit2_abbrev_type::from_flatstring
return (bu_abbrev_type::from_flatstring
(flatstring_concat
(scalefactor.to_str<basis_unit2_abbrev_type::fixed_capacity>(),
(scalefactor.to_str<bu_abbrev_type::fixed_capacity>(),
native_unit2_v[static_cast<std::uint32_t>(native_dim)].abbrev_str())));
}
@ -43,36 +43,36 @@ namespace xo {
* @endcode
**/
static
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
mass_unit2_abbrev(const scalefactor_ratio_type & scalefactor)
{
if (scalefactor.num() == 1) {
switch (scalefactor.den()) {
case 1:
return basis_unit2_abbrev_type::from_chars("g");
return bu_abbrev_type::from_chars("g");
case 1000:
return basis_unit2_abbrev_type::from_chars("mg");
return bu_abbrev_type::from_chars("mg");
case 1000000:
return basis_unit2_abbrev_type::from_chars("ug");
return bu_abbrev_type::from_chars("ug");
case 1000000000:
return basis_unit2_abbrev_type::from_chars("ng");
return bu_abbrev_type::from_chars("ng");
case 1000000000000:
return basis_unit2_abbrev_type::from_chars("pg");
return bu_abbrev_type::from_chars("pg");
}
}
if (scalefactor.den() == 1) {
switch (scalefactor.num()) {
case 1000:
return basis_unit2_abbrev_type::from_chars("kg");
return bu_abbrev_type::from_chars("kg");
case 1000000:
return basis_unit2_abbrev_type::from_chars("t");
return bu_abbrev_type::from_chars("t");
case 1000000000:
return basis_unit2_abbrev_type::from_chars("kt");
return bu_abbrev_type::from_chars("kt");
case 1000000000000:
return basis_unit2_abbrev_type::from_chars("Mt");
return bu_abbrev_type::from_chars("Mt");
case 1000000000000000:
return basis_unit2_abbrev_type::from_chars("Gt");
return bu_abbrev_type::from_chars("Gt");
}
}
@ -82,36 +82,38 @@ namespace xo {
// ----- units for dim::distance -----
static
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
distance_unit2_abbrev(const scalefactor_ratio_type & scalefactor)
{
if (scalefactor.num() == 1) {
switch (scalefactor.den()) {
case 1:
return basis_unit2_abbrev_type::from_chars("m");
return bu_abbrev_type::from_chars("m");
case 1000:
return basis_unit2_abbrev_type::from_chars("mm");
return bu_abbrev_type::from_chars("mm");
case 1000000:
return basis_unit2_abbrev_type::from_chars("um");
return bu_abbrev_type::from_chars("um");
case 1000000000:
return basis_unit2_abbrev_type::from_chars("nm");
return bu_abbrev_type::from_chars("nm");
case 1000000000000:
return basis_unit2_abbrev_type::from_chars("pm");
return bu_abbrev_type::from_chars("pm");
}
}
if (scalefactor.den() == 1) {
switch (scalefactor.num()) {
case 1000:
return basis_unit2_abbrev_type::from_chars("km");
return bu_abbrev_type::from_chars("km");
case 1000000:
return basis_unit2_abbrev_type::from_chars("Mm");
return bu_abbrev_type::from_chars("Mm");
case 299792458:
return basis_unit2_abbrev_type::from_chars("lsec");
return bu_abbrev_type::from_chars("lsec");
case 1000000000:
return basis_unit2_abbrev_type::from_chars("Gm");
return bu_abbrev_type::from_chars("Gm");
case 149597870700:
return basis_unit2_abbrev_type::from_chars("AU");
return bu_abbrev_type::from_chars("AU");
}
}
}
}
@ -121,44 +123,44 @@ namespace xo {
// ----- units for dim::time -----
static
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
time_unit2_abbrev(const scalefactor_ratio_type & scalefactor)
{
if (scalefactor.num() == 1) {
switch (scalefactor.den()) {
case 1:
return basis_unit2_abbrev_type::from_chars("s");
return bu_abbrev_type::from_chars("s");
case 1000:
return basis_unit2_abbrev_type::from_chars("ms");
return bu_abbrev_type::from_chars("ms");
case 1000000:
return basis_unit2_abbrev_type::from_chars("us");
return bu_abbrev_type::from_chars("us");
case 1000000000:
return basis_unit2_abbrev_type::from_chars("ns");
return bu_abbrev_type::from_chars("ns");
case 1000000000000:
return basis_unit2_abbrev_type::from_chars("ps");
return bu_abbrev_type::from_chars("ps");
}
}
if (scalefactor.den() == 1) {
switch (scalefactor.num()) {
case 60:
return basis_unit2_abbrev_type::from_chars("min");
return bu_abbrev_type::from_chars("min");
case 3600:
return basis_unit2_abbrev_type::from_chars("hr");
return bu_abbrev_type::from_chars("hr");
case 24*3600:
return basis_unit2_abbrev_type::from_chars("dy");
return bu_abbrev_type::from_chars("dy");
case 7*24*3600:
return basis_unit2_abbrev_type::from_chars("wk");
return bu_abbrev_type::from_chars("wk");
case 30*24*3600:
return basis_unit2_abbrev_type::from_chars("mo");
return bu_abbrev_type::from_chars("mo");
case 250*24*3600:
return basis_unit2_abbrev_type::from_chars("yr250");
return bu_abbrev_type::from_chars("yr250");
case 360*24*3600:
return basis_unit2_abbrev_type::from_chars("yr360");
return bu_abbrev_type::from_chars("yr360");
case 365*24*3600:
return basis_unit2_abbrev_type::from_chars("yr365");
return bu_abbrev_type::from_chars("yr365");
case 365*24*3600+6*3600:
return basis_unit2_abbrev_type::from_chars("yr");
return bu_abbrev_type::from_chars("yr");
}
}
@ -167,13 +169,13 @@ namespace xo {
// ----- units for dim::currency -----
static constexpr basis_unit2_abbrev_type
static constexpr bu_abbrev_type
currency_unit2_abbrev(const scalefactor_ratio_type & scalefactor)
{
if (scalefactor.num() == 1) {
switch(scalefactor.den()) {
case 1:
return basis_unit2_abbrev_type::from_chars("ccy");
return bu_abbrev_type::from_chars("ccy");
}
}
@ -182,13 +184,13 @@ namespace xo {
// ----- units for dim::price -----
static constexpr basis_unit2_abbrev_type
static constexpr bu_abbrev_type
price_unit2_abbrev(const scalefactor_ratio_type & scalefactor)
{
if (scalefactor.num() == 1) {
switch(scalefactor.den()) {
case 1:
return basis_unit2_abbrev_type::from_chars("px");
return bu_abbrev_type::from_chars("px");
}
}
@ -198,7 +200,7 @@ namespace xo {
// ----- basis_unit2_abbrev -----
static
constexpr basis_unit2_abbrev_type
constexpr bu_abbrev_type
basis_unit2_abbrev(dimension native_dim,
const scalefactor_ratio_type & scalefactor)
{
@ -215,13 +217,13 @@ namespace xo {
return price_unit2_abbrev(scalefactor);
case dimension::invalid:
case dimension::n_dim:
return basis_unit2_abbrev_type();
return bu_abbrev_type();
break;
}
/* unreachable (for well-constructed dim instances) */
return basis_unit2_abbrev_type();
return bu_abbrev_type();
}
} /*namespace abbrev*/
} /*namespace qty*/

View file

@ -46,10 +46,10 @@ namespace xo {
/* e.g.
* [(1/1000000000, "nm"), (1/1000000, "um"), (1/1000, "mm"), (1/1, "m"), (1000/1, "km")]
*/
using native_scale_v = std::vector<std::pair<scalefactor_ratio_type, basis_unit2_abbrev_type>>;
using native_scale_v = std::vector<std::pair<scalefactor_ratio_type, bu_abbrev_type>>;
/** @brief get basis-unit abbreviation at runtime **/
basis_unit2_abbrev_type bu_abbrev(dim basis_dim,
bu_abbrev_type bu_abbrev(dim basis_dim,
const scalefactor_ratio_type & scalefactor) const
{
const auto & bu_abbrev_v = bu_abbrev_vv_[static_cast<std::size_t>(basis_dim)];
@ -86,7 +86,7 @@ namespace xo {
/** @brief establish abbreviation @p abbrev for basis unit @p bu
**/
void bu_establish_abbrev(const basis_unit & bu,
const basis_unit2_abbrev_type & abbrev) {
const bu_abbrev_type & abbrev) {
auto & bu_abbrev_v = bu_abbrev_vv_[static_cast<std::size_t>(bu.native_dim())];