From 034f239f9698983aa1e015c8cf72000ce7e0f2cc Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 19 Mar 2020 14:44:56 +0100 Subject: [PATCH] PrefixType renamed to PrefixFamily + units hierarchy PNG fixed --- docs/DESIGN.md | 22 +++--- docs/_static/img/units.png | Bin 33552 -> 32774 bytes docs/framework/units.rst | 14 ++-- docs/reference/concepts.rst | 45 +++++++----- src/include/units/bits/to_string.h | 10 +-- src/include/units/concepts.h | 85 ++++++++++++++++++++--- src/include/units/data/prefixes.h | 2 +- src/include/units/physical/si/prefixes.h | 2 +- src/include/units/prefix.h | 14 ++-- src/include/units/unit.h | 20 +++--- 10 files changed, 146 insertions(+), 68 deletions(-) diff --git a/docs/DESIGN.md b/docs/DESIGN.md index f50c95fe..20816cb1 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -97,12 +97,12 @@ All below class templates indirectly derive from a `scaled_unit` class template - Defines a named, in most cases base or coherent unit that is then passed to a dimension's definition. - A named unit may be used by other units defined with the prefix of the same type, unless - `no_prefix` is provided for `PrefixType` template parameter (in such a case it is impossible + `no_prefix` is provided for `PrefixFamily` template parameter (in such a case it is impossible to define a prefixed unit based on this one). - `named_scaled_unit` - Defines a new named unit that is a scaled version of another unit. - Such unit can be used by other units defined with the prefix of the same type, unless - `no_prefix` is provided for `PrefixType` template parameter (in such a case it is impossible + `no_prefix` is provided for `PrefixFamily` template parameter (in such a case it is impossible to define a prefixed unit based on this one). - `prefixed_unit` - Defines a new unit that is a scaled version of another unit by the provided prefix. @@ -115,26 +115,26 @@ All below class templates indirectly derive from a `scaled_unit` class template - All of the units provided should also be a named ones so it is possible to create a deduced symbol text. -Some of the above types depend on `PrefixType` and `no_prefix`. `PrefixType` is a concept that +Some of the above types depend on `PrefixFamily` and `no_prefix`. `PrefixFamily` is a concept that is defined as: ```cpp template -concept PrefixType = std::derived_from; +concept PrefixFamily = std::derived_from; ``` -where `prefix_type` is just an empty tag type used to identify the beginning of prefix types +where `prefix_family` is just an empty tag type used to identify the beginning of prefix types hierarchy and `no_prefix` is one of its children: ```cpp -struct prefix_type {}; -struct no_prefix : prefix_type {}; +struct prefix_family {}; +struct no_prefix : prefix_family {}; ``` Concrete prefix derives from a `prefix` class template: ```cpp -template +template requires (!std::same_as) struct prefix; ``` @@ -151,7 +151,7 @@ Coming back to units, here are a few examples of unit definitions: namespace units::si { // prefixes -struct prefix : prefix_type {}; +struct prefix : prefix_family {}; struct centi : units::prefix> {}; struct kilo : units::prefix> {}; @@ -508,7 +508,7 @@ a series of checks: dimension: - prefix: - if ratio of the scaled unit is `1`, than no prefix is being printed, - - otherwise, if `PrefixType` template parameter of a reference unit is different than + - otherwise, if `PrefixFamily` template parameter of a reference unit is different than `no_prefix`, and if the ratio of scaled unit matches the ratio of a prefix of a specified type, than the symbol of this prefix will be used, - otherwise, non-standard ratio (i.e. `2 [60]Hz`) will be printed. @@ -781,7 +781,7 @@ adds support for digital information quantities. In summary it adds: ```cpp namespace units::data { - struct prefix : prefix_type {}; + struct prefix : prefix_family {}; struct kibi : units::prefix> {}; struct mebi : units::prefix> {}; diff --git a/docs/_static/img/units.png b/docs/_static/img/units.png index 311abd6f1a6ed2ae972c8da5d5fc19df001dce9f..be543e5f2e6e563a9e6973db26c28e3d892cfc12 100644 GIT binary patch literal 32774 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

FFEGpk<$&Y=trouGQZ;>D zbyDJzL+TZSU41WKX$!8`_pOz_9$(JeC8F8%_ICM7DT~f!qMAV#lM`%eeyq5?)5W1z z>R$ZKC%z`4x^`tb(gnib+?6W-J>Pp`CSU4N{FT-n$=~1A&iMCjPLE#1%B8bE|4Xt7_-}VrHMhjcJ1Rh_R%l}Nrs(QBF}tQ* z|G6~Man}<2$e&AJoe-P&^Zwo6A+k%>@Bi{BxAxh&r^)1VqX`#XI<vSKG-q`@E=$ z{1M&ciq*!7Zdt$DeCNx;0W4 z=Po?qw{OSUS$jDiALnyiTK(?J`2{vr=B&wbr83ifnN$j%a=7eDIHOmq6=xVU+a~4L zecN4+f6Iqjm7Hj}_bUBw#ZNzlD>o$5lczza1-_key1(|cb$O7%GuimUr78|gicSqp zA0NH<+HHNlugUPW+SD&guB4uJ~c{H#vftFJ{C|L492T><5aJFbOavdx9s`C~)%)=<8(8vH9l@{z`)??>gTe~DWM4f9C^}4 diff --git a/docs/framework/units.rst b/docs/framework/units.rst index a2f10be0..b38c6546 100644 --- a/docs/framework/units.rst +++ b/docs/framework/units.rst @@ -219,7 +219,7 @@ complete list of all the :term:`SI` prefixes supported by the library:: namespace si { - struct prefix : prefix_type {}; + struct prefix : prefix_family {}; struct yocto : units::prefix> {}; struct zepto : units::prefix> {}; @@ -249,7 +249,7 @@ domain:: namespace data { - struct prefix : prefix_type {}; + struct prefix : prefix_family {}; struct kibi : units::prefix> {}; struct mebi : units::prefix> {}; @@ -322,11 +322,11 @@ of a `scaled_unit` class template: #direction: right - [scaled_unit]<:-[unit] - [scaled_unit]<:-[named_unit] - [scaled_unit]<:-[named_scaled_unit] - [scaled_unit]<:-[prefixed_unit] - [scaled_unit]<:-[deduced_unit] + [scaled_unit]<:-[unit] + [scaled_unit]<:-[named_unit] + [scaled_unit]<:-[named_scaled_unit] + [scaled_unit]<:-[prefixed_unit] + [scaled_unit]<:-[deduced_unit] `scaled_unit` is a class template used exclusively by the library's framework and user should not instantiate it by him/her-self. However the user can sometimes diff --git a/docs/reference/concepts.rst b/docs/reference/concepts.rst index d8b42b9d..2e18c4b9 100644 --- a/docs/reference/concepts.rst +++ b/docs/reference/concepts.rst @@ -5,58 +5,69 @@ Concepts .. note:: - All names defined in this chapter reside in the :any:`units` namespace unless specified otherwise. + All names defined in this chapter reside in the :any:`units` namespace unless + specified otherwise. -.. concept:: template PrefixType +.. concept:: template PrefixFamily - Satisfied by all types derived from :class:`prefix_type`. + A concept matching a prefix family. Satisfied by all types derived from :class:`prefix_family`. .. concept:: template Prefix - Satisfied by all instantiations of :class:`prefix`. + A concept matching a symbol prefix. Satisfied by all instantiations of :class:`prefix`. .. concept:: template Ratio - Satisfied by all instantiations of :class:`ratio`. + A concept matching a ratio. Satisfied by all instantiations of :class:`ratio`. .. concept:: template UnitRatio - Satisfied by all types that satisfy :expr:`Ratio` and for which :expr:`R::num > 0` and :expr:`R::den > 0`. + A concept matching unit's ratio. Satisfied by all types that satisfy :expr:`Ratio` and + for which :expr:`R::num > 0` and :expr:`R::den > 0`. .. concept:: template BaseDimension - Satisfied by all dimension types derived from instantiation of :class:`base_dimension`. + A concept matching all base dimensions in the library. Satisfied by all dimension types + derived from the instantiation of :class:`base_dimension`. .. concept:: template Exponent - Satisfied by all instantiations of :class:`exp`. + A concept matching dimension's exponents. Satisfied by all instantiations of :class:`exp`. .. concept:: template DerivedDimension - Satisfied by all dimension types derived from instantiation of :class:`detail::derived_dimension_base`. + A concept matching all derived dimensions in the library. Satisfied by all dimension + types derived from the instantiation of :class:`detail::derived_dimension_base`. .. concept:: template Dimension - Satisfied by all dimension types for which either :expr:`BaseDimension` or :expr:`DerivedDimension` is ``true``. + A concept matching all dimensions in the library. Satisfied by all dimension types for + which either :expr:`BaseDimension` or :expr:`DerivedDimension` is ``true``. .. concept:: template Unit - Satisfied by all unit types derived from instantiation of :class:`scaled_unit`. + A concept matching all unit types in the library. Satisfied by all unit types derived + from the instantiation of :class:`scaled_unit`. .. concept:: template UnitOf - Satisfied by all unit types that satisfy :expr:`Unit`, :expr:`Dimension`, and for which - :expr:`U::reference` and :expr:`dimension_unit::reference` denote the same unit type. + A concept matching only units of a specified dimension. Satisfied by all unit types that + satisfy :expr:`Unit`, :expr:`Dimension`, and for which :expr:`U::reference` and + :expr:`dimension_unit::reference` denote the same unit type. + + :tparam U: Type to verify against concept constraints. + :tparam D: Dimension type to use for verification. .. concept:: template Quantity - Satisfied by all instantiations of :class:`quantity`. + A concept matching all quantities in the library. Satisfied by all instantiations of :class:`quantity`. .. concept:: template WrappedQuantity - Satisfied by all wrapper types that satisfy :expr:`Quantity` recursively - (i.e. :expr:`std::optional>`). + A concept matching types that wrap quantity objects. Satisfied by all wrapper types that + satisfy :expr:`Quantity` recursively + (i.e. :expr:`std::optional>`). .. concept:: template Scalar - Satisfied by types that satisfy :expr:`(!Quantity) && (!WrappedQuantity) && std::regular`. + A concept matching non-Quantity types. Satisfied by types that satisfy :expr:`(!Quantity) && (!WrappedQuantity) && std::regular`. diff --git a/src/include/units/bits/to_string.h b/src/include/units/bits/to_string.h index 31f844d7..3e91f9da 100644 --- a/src/include/units/bits/to_string.h +++ b/src/include/units/bits/to_string.h @@ -64,7 +64,7 @@ constexpr auto ratio_text() } } -template +template constexpr auto prefix_or_ratio_text() { if constexpr(Ratio::num == 1 && Ratio::den == 1 && Ratio::exp == 0) { @@ -72,11 +72,11 @@ constexpr auto prefix_or_ratio_text() return basic_fixed_string(""); } else { - if constexpr (!std::is_same_v) { + if constexpr (!std::is_same_v) { // try to form a prefix - using prefix = downcast>; + using prefix = downcast>; - if constexpr(!std::is_same_v>) { + if constexpr(!std::is_same_v>) { // print as a prefixed unit return prefix::symbol; } @@ -149,7 +149,7 @@ constexpr auto unit_text() // print as a prefix or ratio of a coherent unit using coherent_unit = dimension_unit; using ratio = ratio_divide; - auto prefix_txt = prefix_or_ratio_text(); + auto prefix_txt = prefix_or_ratio_text(); if constexpr(has_symbol) { // use predefined coherent unit symbol diff --git a/src/include/units/concepts.h b/src/include/units/concepts.h index 8bb3e666..f1a5b9cf 100644 --- a/src/include/units/concepts.h +++ b/src/include/units/concepts.h @@ -42,11 +42,16 @@ concept basic_arithmetic = // exposition only } // namespace detail -// PrefixType -struct prefix_type; +// PrefixFamily +struct prefix_family; +/** + * @brief A concept matching a prefix family + * + * Satisfied by all types derived from `prefix_family` + */ template -concept PrefixType = std::derived_from; +concept PrefixFamily = std::derived_from; // Prefix // TODO gcc:92150 @@ -56,11 +61,16 @@ concept PrefixType = std::derived_from; // template // inline constexpr bool is_prefix = false; -// template -// inline constexpr bool is_prefix> = true; +// template +// inline constexpr bool is_prefix> = true; // } // namespace detail +/** + * @brief A concept matching a symbol prefix + * + * Satisfied by all instantiations of `prefix`. + */ template // concept Prefix = detail::is_prefix; concept Prefix = true; @@ -73,11 +83,19 @@ inline constexpr bool is_ratio = false; } // namespace detail +/** + * @brief A concept matching a ratio + * + * Satisfied by all instantiations of `ratio`. + */ template concept Ratio = detail::is_ratio; - -// UnitRatio +/** + * @brief A concept matching unit's ratio + * + * Satisfied by all types that satisfy `Ratio` and for which `R::num > 0` and `R::den > 0` + */ template concept UnitRatio = Ratio && R::num > 0 && R::den > 0; // double negatives not allowed @@ -85,10 +103,14 @@ concept UnitRatio = Ratio && R::num > 0 && R::den > 0; // double negatives no template struct scaled_unit; +/** + * @brief A concept matching all unit types in the library + * + * Satisfied by all unit types derived from the instantiation of :class:`scaled_unit`. + */ template concept Unit = is_derived_from_instantiation; -// BaseDimension template requires U::is_named struct base_dimension; @@ -112,6 +134,11 @@ inline constexpr bool is_base_dimension> = true; } // namespace detail +/** + * @brief A concept matching all base dimensions in the library. + * + * Satisfied by all dimension types derived from the instantiation of `base_dimension`. + */ template concept BaseDimension = detail::is_base_dimension; @@ -123,6 +150,11 @@ inline constexpr bool is_exp = false; } // namespace detail +/** + * @brief A concept matching dimension's exponents. + * + * Satisfied by all instantiations of :class:`exp`. + */ template concept Exponent = detail::is_exp; @@ -135,10 +167,20 @@ struct derived_dimension_base; } // namespace detail +/** + * @brief A concept matching all derived dimensions in the library. + * + * Satisfied by all dimension types derived from the instantiation of `detail::derived_dimension_base`. + */ template concept DerivedDimension = is_instantiation, detail::derived_dimension_base>; // Dimension +/** + * @brief A concept matching all dimensions in the library. + * + * Satisfied by all dimension types for which either `BaseDimension` or `DerivedDimension` is `true`. + */ template concept Dimension = BaseDimension || DerivedDimension; @@ -163,6 +205,15 @@ struct dimension_unit_impl { template using dimension_unit = detail::dimension_unit_impl::type; +/** + * @brief A concept matching only units of a specified dimension. + * + * Satisfied by all unit types that satisfy `Unit`, `Dimension`, and for which + * `U::reference` and `dimension_unit::reference` denote the same unit type. + * + * @tparam U Type to verify. + * @tparam D Dimension type to use for verification. + */ template concept UnitOf = Unit && @@ -177,6 +228,11 @@ inline constexpr bool is_quantity = false; } // namespace detail +/** + * @brief A concept matching all quantities in the library. + * + * Satisfied by all instantiations of :class:`quantity`. + */ template concept Quantity = detail::is_quantity; @@ -193,11 +249,22 @@ inline constexpr bool is_wrapped_quantity = Quantity } // namespace detail +/** + * @brief A concept matching types that wrap quantity objects. + * + * Satisfied by all wrapper types that satisfy `Quantity` + * recursively (i.e. `std::optional>`). + */ template concept WrappedQuantity = detail::is_wrapped_quantity; // Scalar +/** + * @brief A concept matching non-Quantity types. + * + * Satisfied by types that satisfy `(!Quantity) && (!WrappedQuantity) && std::regular`. + */ template -concept Scalar = (!Quantity) && (!WrappedQuantity) && std::regular; // && std::totally_ordered;// && detail::basic_arithmetic; +concept Scalar = (!Quantity) && (!WrappedQuantity) && std::regular; // TODO: && std::totally_ordered;// && detail::basic_arithmetic; } // namespace units diff --git a/src/include/units/data/prefixes.h b/src/include/units/data/prefixes.h index 5cdd3e21..4e6e683a 100644 --- a/src/include/units/data/prefixes.h +++ b/src/include/units/data/prefixes.h @@ -26,7 +26,7 @@ namespace units::data { -struct prefix : prefix_type {}; +struct prefix : prefix_family {}; struct kibi : units::prefix> {}; struct mebi : units::prefix> {}; diff --git a/src/include/units/physical/si/prefixes.h b/src/include/units/physical/si/prefixes.h index 30d3e8ad..4a0dcf99 100644 --- a/src/include/units/physical/si/prefixes.h +++ b/src/include/units/physical/si/prefixes.h @@ -26,7 +26,7 @@ namespace units::si { -struct prefix : prefix_type {}; +struct prefix : prefix_family {}; // clang-format off struct yocto : units::prefix> {}; diff --git a/src/include/units/prefix.h b/src/include/units/prefix.h index 06bb76ce..46951bfd 100644 --- a/src/include/units/prefix.h +++ b/src/include/units/prefix.h @@ -29,11 +29,11 @@ namespace units { /** - * @brief The base for all prefix types + * @brief The base for all prefix families * - * Every prefix type should inherit from this type to satisfy PrefixType concept. + * Every prefix family should inherit from this type to satisfy PrefixFamily concept. */ -struct prefix_type {}; +struct prefix_family {}; /** * @brief No prefix possible for the unit @@ -41,13 +41,13 @@ struct prefix_type {}; * This is a special prefix type tag specifying that the unit can not be scaled with any kind * of the prefix. */ -struct no_prefix : prefix_type {}; +struct no_prefix : prefix_family {}; namespace detail { -template +template struct prefix_base : downcast_base> { - using prefix_type = PT; + using prefix_family = PT; using ratio = R; }; @@ -68,7 +68,7 @@ struct prefix_base : downcast_base> { * @tparam Symbol a text representation of the prefix * @tparam R factor to be used to scale a unit */ -template +template requires (!std::same_as) struct prefix : downcast_child> { static constexpr auto symbol = Symbol; diff --git a/src/include/units/unit.h b/src/include/units/unit.h index 9471f993..2654eafd 100644 --- a/src/include/units/unit.h +++ b/src/include/units/unit.h @@ -72,7 +72,7 @@ struct same_unit_reference : std::is_same struct unit : downcast_child, Child>> { static constexpr bool is_named = false; - using prefix_type = no_prefix; + using prefix_family = no_prefix; }; /** @@ -94,11 +94,11 @@ struct unknown_coherent_unit : unit {}; * @tparam Symbol a short text representation of the unit * @tparam PT no_prefix or a type of prefix family */ -template +template struct named_unit : downcast_child, Child>> { static constexpr bool is_named = true; static constexpr auto symbol = Symbol; - using prefix_type = PT; + using prefix_family = PT; }; /** @@ -115,11 +115,11 @@ struct named_unit : downcast_child, Child>> { * @tparam R a scale to apply to U * @tparam U a reference unit to scale */ -template +template struct named_scaled_unit : downcast_child, typename U::reference>> { static constexpr bool is_named = true; static constexpr auto symbol = Symbol; - using prefix_type = PT; + using prefix_family = PT; }; /** @@ -134,12 +134,12 @@ struct named_scaled_unit : downcast_child - requires U::is_named && std::same_as + requires U::is_named && std::same_as struct prefixed_unit : downcast_child, typename U::reference>> { static constexpr bool is_named = true; static constexpr auto symbol = P::symbol + U::symbol; - using prefix_type = no_prefix; + using prefix_family = no_prefix; }; /** @@ -161,14 +161,14 @@ template struct deduced_unit : downcast_child> { static constexpr bool is_named = false; static constexpr auto symbol = detail::deduced_symbol_text(); - using prefix_type = no_prefix; + using prefix_family = no_prefix; }; -// template +// template // struct named_deduced_derived_unit : downcast_child> { // static constexpr bool is_named = true; // static constexpr auto symbol = Symbol; -// using prefix_type = PT; +// using prefix_family = PT; // }; } // namespace units