diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index c595a723..5b784d58 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -95,6 +95,7 @@ add_custom_command(OUTPUT "${SPHINX_INDEX_FILE}" "${CMAKE_CURRENT_SOURCE_DIR}/examples/linear_algebra.rst" "${CMAKE_CURRENT_SOURCE_DIR}/examples/measurement.rst" "${CMAKE_CURRENT_SOURCE_DIR}/examples/total_energy.rst" + "${CMAKE_CURRENT_SOURCE_DIR}/examples/unknown_dimension.rst" "${CMAKE_CURRENT_SOURCE_DIR}/faq.rst" @@ -104,6 +105,7 @@ add_custom_command(OUTPUT "${SPHINX_INDEX_FILE}" "${CMAKE_CURRENT_SOURCE_DIR}/framework/conversions_and_casting.rst" "${CMAKE_CURRENT_SOURCE_DIR}/framework/dimensions.rst" "${CMAKE_CURRENT_SOURCE_DIR}/framework/quantities.rst" + "${CMAKE_CURRENT_SOURCE_DIR}/framework/quantity_points.rst" "${CMAKE_CURRENT_SOURCE_DIR}/framework/text_output.rst" "${CMAKE_CURRENT_SOURCE_DIR}/framework/units.rst" diff --git a/docs/faq.rst b/docs/faq.rst index 12c8b5ec..e4957155 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -51,8 +51,8 @@ naming and we came up with ``q_`` prefix which results in a creation of quantity of a provided unit. -Why do we use UDLs reserved for the C++ standard (no `_` prefix)? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Why do we use UDLs reserved for the C++ standard (no ``_`` prefix)? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This library is meant to become a part of the C++ Standard Library at some point in the future. We decided to work with the target interface to get implementation @@ -63,8 +63,8 @@ with literals already existing in the language in our initial approach This approach has some side effects though. We had to disable some compiler warnings to make it work: -- `/wd4455` on MSVC, -- `-Wno-literal-suffix` on other compilers. +- ``/wd4455`` on MSVC, +- ``-Wno-literal-suffix`` on other compilers. Text formatting diff --git a/docs/usage.rst b/docs/usage.rst index 3d29cd21..8192732e 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -261,7 +261,7 @@ differences: `the project's README file `_ or on `the project's Bintray `_. -3. Force Conan to check for updated recipes `-u` and to build outdated packages `-b outdated`: +3. Force Conan to check for updated recipes ``-u`` and to build outdated packages ``-b outdated``: .. code-block:: shell @@ -279,7 +279,7 @@ enough to handle simple dependencies and configurations. If your project setup i may prefer to use ``cmake`` generator. In such a case the above procedures should be updated as follows: -1. Specify `cmake` generator in your Conan configuration file: +1. Specify ``cmake`` generator in your Conan configuration file: .. code-block:: ini :caption: conanfile.txt @@ -317,7 +317,7 @@ in **mp-units** repository, you should: 1. Add remotes of additional Conan dependencies. 2. Use the *CMakeLists.txt* from the top-level directory. 3. Obtain Python dependencies. -4. Run Conan with :envvar:`CONAN_RUN_TESTS` = ``True``. +4. Run Conan with `CONAN_RUN_TESTS`_ = ``True``. .. code-block:: shell diff --git a/src/include/units/bits/external/type_traits.h b/src/include/units/bits/external/type_traits.h index f48bd2ce..db607b05 100644 --- a/src/include/units/bits/external/type_traits.h +++ b/src/include/units/bits/external/type_traits.h @@ -24,6 +24,7 @@ #include #include +#include namespace units { @@ -58,32 +59,22 @@ template using is_same = std::bool_constant>; // is_specialization_of -namespace detail { - template typename Type> -inline constexpr bool is_specialization_of_impl = false; +inline constexpr bool is_specialization_of = false; template typename Type> -inline constexpr bool is_specialization_of_impl, Type> = true; - -} // namespace detail - -template typename Type> -inline constexpr bool is_specialization_of = detail::is_specialization_of_impl; +inline constexpr bool is_specialization_of, Type> = true; // is_derived_from_specialization_of namespace detail { -template typename Type> -struct is_derived_from_specialization_of_impl { - template - static constexpr std::true_type check_base(const Type&); - static constexpr std::false_type check_base(...); -}; +template typename Type, typename... Params> +void to_base_specialization_of(const volatile Type*); } // namespace detail template typename Type> -inline constexpr bool is_derived_from_specialization_of = decltype(detail::is_derived_from_specialization_of_impl::check_base(std::declval()))::value; +// inline constexpr bool // TODO: Replace with concept when it works with MSVC +concept is_derived_from_specialization_of = requires { detail::to_base_specialization_of(std::declval()); }; } // namespace units diff --git a/src/include/units/concepts.h b/src/include/units/concepts.h index 7f7acc7c..686e9f68 100644 --- a/src/include/units/concepts.h +++ b/src/include/units/concepts.h @@ -28,6 +28,8 @@ #include #include #include +#include +#include namespace units { @@ -84,14 +86,8 @@ struct scaled_unit; // TODO: Remove when P1985 accepted namespace detail { -struct is_derived_from_scaled_unit_impl { - template - static constexpr std::true_type check_base(const scaled_unit&); - static constexpr std::false_type check_base(...); -}; - -template -inline constexpr bool is_derived_from_scaled_unit = decltype(is_derived_from_scaled_unit_impl::check_base(std::declval()))::value; +template +void to_base_scaled_unit(const volatile scaled_unit*); } // namespace detail @@ -101,22 +97,17 @@ inline constexpr bool is_derived_from_scaled_unit = decltype(is_derived_from_sca * Satisfied by all unit types derived from an specialization of :class:`scaled_unit`. */ template -concept Unit = detail::is_derived_from_scaled_unit; +concept Unit = requires { detail::to_base_scaled_unit(std::declval()); }; +// BaseDimension template requires U::is_named struct base_dimension; namespace detail { -struct is_derived_from_base_dimension_impl { - template - static constexpr std::true_type check_base(const base_dimension&); - static constexpr std::false_type check_base(...); -}; - -template -inline constexpr bool is_derived_from_base_dimension = decltype(is_derived_from_base_dimension_impl::check_base(std::declval()))::value; +template +void to_base_base_dimension(const volatile base_dimension*); } // namespace detail @@ -126,7 +117,7 @@ inline constexpr bool is_derived_from_base_dimension = decltype(is_derived_from_ * Satisfied by all dimension types derived from an specialization of `base_dimension`. */ template -concept BaseDimension = detail::is_derived_from_base_dimension; +concept BaseDimension = requires { detail::to_base_base_dimension(std::declval()); }; // Exponent namespace detail {