feat: ABI concerns resolved with introduction of u8 strings for symbols

This commit is contained in:
Mateusz Pusz
2024-02-16 22:13:13 +01:00
parent 54dbeea68b
commit cb858f1e51
18 changed files with 112 additions and 93 deletions

View File

@@ -40,30 +40,30 @@ static_assert(sym1 <= 'b');
static_assert(sym1 <= 'c');
static_assert(sym1 >= 'b');
static_assert(sym1 >= 'a');
static_assert(sym1.unicode() == "b");
static_assert(sym1.unicode() == u8"b");
static_assert(sym1.ascii() == "b");
constexpr basic_symbol_text sym3("ab");
static_assert(sym3.unicode() == "ab");
static_assert(sym3.unicode() == u8"ab");
static_assert(sym3.ascii() == "ab");
constexpr basic_fixed_string txt1("bc");
constexpr basic_symbol_text sym4(txt1);
static_assert(sym4.unicode() == "bc");
static_assert(sym4.unicode() == u8"bc");
static_assert(sym4.ascii() == "bc");
constexpr basic_symbol_text sym5("bc", "de");
static_assert(sym5.unicode() == "bc");
constexpr basic_symbol_text sym5(u8"bc", "de");
static_assert(sym5.unicode() == u8"bc");
static_assert(sym5.ascii() == "de");
constexpr basic_fixed_string txt2("de");
constexpr basic_symbol_text sym6(sym4.unicode(), txt2);
static_assert(sym6.unicode() == "bc");
static_assert(sym6.unicode() == u8"bc");
static_assert(sym6.ascii() == "de");
static_assert(sym6 == basic_symbol_text("bc", "de"));
static_assert(sym6 != basic_symbol_text("fg", "hi"));
static_assert(sym6 != basic_symbol_text("bcd", "ef"));
static_assert(sym6 == basic_symbol_text(u8"bc", "de"));
static_assert(sym6 != basic_symbol_text(u8"fg", "hi"));
static_assert(sym6 != basic_symbol_text(u8"bcd", "ef"));
static_assert(sym6 < basic_symbol_text("c"));
static_assert(sym6 > basic_symbol_text("a"));
@@ -75,13 +75,13 @@ static_assert(sym6 >= basic_symbol_text("bc"));
static_assert(basic_symbol_text("a") + sym4 == basic_symbol_text("abc"));
static_assert(sym4 + basic_symbol_text("f") == basic_symbol_text("bcf"));
static_assert(basic_symbol_text("a", "f") + sym6 == basic_symbol_text("abc", "fde"));
static_assert(sym6 + basic_symbol_text("a", "f") == basic_symbol_text("bca", "def"));
static_assert(basic_symbol_text(u8"a", "f") + sym6 == basic_symbol_text(u8"abc", "fde"));
static_assert(sym6 + basic_symbol_text(u8"a", "f") == basic_symbol_text(u8"bca", "def"));
static_assert(basic_symbol_text('a') + sym6 == basic_symbol_text("abc", "ade"));
static_assert(sym6 + basic_symbol_text('f') == basic_symbol_text("bcf", "def"));
static_assert(basic_symbol_text('a') + sym6 == basic_symbol_text(u8"abc", "ade"));
static_assert(sym6 + basic_symbol_text('f') == basic_symbol_text(u8"bcf", "def"));
static_assert(basic_symbol_text("a") + sym6 == basic_symbol_text("abc", "ade"));
static_assert(sym6 + basic_symbol_text("f") == basic_symbol_text("bcf", "def"));
static_assert(basic_symbol_text("a") + sym6 == basic_symbol_text(u8"abc", "ade"));
static_assert(sym6 + basic_symbol_text("f") == basic_symbol_text(u8"bcf", "def"));
} // namespace

View File

@@ -44,7 +44,7 @@ using percent_ = struct percent;
inline constexpr struct dim_length_ : base_dimension<"L"> {} dim_length;
inline constexpr struct dim_mass_ : base_dimension<"M"> {} dim_mass;
inline constexpr struct dim_time_ : base_dimension<"T"> {} dim_time;
inline constexpr struct dim_thermodynamic_temperature_ : base_dimension<basic_symbol_text{"Θ", "O"}> {} dim_thermodynamic_temperature;
inline constexpr struct dim_thermodynamic_temperature_ : base_dimension<basic_symbol_text{u8"Θ", "O"}> {} dim_thermodynamic_temperature;
// quantities specification
QUANTITY_SPEC_(length, dim_length);
@@ -71,11 +71,11 @@ inline constexpr struct newton_ : named_unit<"N", kilogram * metre / square(seco
inline constexpr struct pascal_ : named_unit<"Pa", newton / square(metre)> {} pascal;
inline constexpr struct joule_ : named_unit<"J", newton * metre> {} joule;
inline constexpr struct watt_ : named_unit<"W", joule / second> {} watt;
inline constexpr struct degree_Celsius_ : named_unit<basic_symbol_text{"°C", "`C"}, kelvin> {} degree_Celsius;
inline constexpr struct degree_Celsius_ : named_unit<basic_symbol_text{u8"°C", "`C"}, kelvin> {} degree_Celsius;
inline constexpr struct minute_ : named_unit<"min", mag<60> * second> {} minute;
inline constexpr struct hour_ : named_unit<"h", mag<60> * minute> {} hour;
inline constexpr struct degree_ : named_unit<basic_symbol_text{"°", "deg"}, mag_pi / mag<180> * radian> {} degree;
inline constexpr struct degree_ : named_unit<basic_symbol_text{u8"°", "deg"}, mag_pi / mag<180> * radian> {} degree;
inline constexpr struct yard_ : named_unit<"yd", mag<ratio{9'144, 10'000}> * metre> {} yard;
inline constexpr struct mile_ : named_unit<"mi", mag<1760> * yard> {} mile;
@@ -84,7 +84,7 @@ inline constexpr struct kilometre_ : decltype(si::kilo<metre>) {} kilometre;
inline constexpr struct kilojoule_ : decltype(si::kilo<joule>) {} kilojoule;
// physical constant units
inline constexpr struct standard_gravity_ : named_unit<basic_symbol_text{"g₀", "g_0"}, mag<ratio{980'665, 100'000}> * metre / square(second)> {} standard_gravity;
inline constexpr struct standard_gravity_ : named_unit<basic_symbol_text{u8"g₀", "g_0"}, mag<ratio{980'665, 100'000}> * metre / square(second)> {} standard_gravity;
inline constexpr struct speed_of_light_in_vacuum_ : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum;
// clang-format on
@@ -194,7 +194,7 @@ static_assert(convertible(standard_gravity, standard_gravity));
static_assert(convertible(standard_gravity, metre / square(second)));
static_assert(standard_gravity == standard_gravity);
static_assert(standard_gravity != metre / square(second)); // magnitude is different
static_assert(standard_gravity.symbol == basic_symbol_text{"g₀", "g_0"});
static_assert(standard_gravity.symbol == basic_symbol_text{u8"g₀", "g_0"});
// prefixed_unit
static_assert(is_of_type<kilometre, kilometre_>);
@@ -229,7 +229,7 @@ static_assert(si::atto<metre>.symbol == "am");
static_assert(si::femto<metre>.symbol == "fm");
static_assert(si::pico<metre>.symbol == "pm");
static_assert(si::nano<metre>.symbol == "nm");
static_assert(si::micro<metre>.symbol == basic_symbol_text{"µm", "um"});
static_assert(si::micro<metre>.symbol == basic_symbol_text{u8"µm", "um"});
static_assert(si::milli<metre>.symbol == "mm");
static_assert(si::centi<metre>.symbol == "cm");
static_assert(si::deci<metre>.symbol == "dm");