From c6e95a9fc7699b81bd37d0524a86e8e1ba99575c Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 6 Feb 2025 17:16:12 +0100 Subject: [PATCH] refactor: `limits.h` removed and the contents moved to `quantity.h` and `quantity_point.h` Resolves #673 --- src/core/CMakeLists.txt | 1 - src/core/include/mp-units/core.h | 1 - .../include/mp-units/framework/quantity.h | 60 +++++++ .../mp-units/framework/quantity_point.h | 60 +++++++ src/core/include/mp-units/limits.h | 154 ------------------ test/static/limits_test.cpp | 1 - 6 files changed, 120 insertions(+), 157 deletions(-) delete mode 100644 src/core/include/mp-units/limits.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 3074c15f..b1f9c89e 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -78,7 +78,6 @@ add_mp_units_module( include/mp-units/concepts.h include/mp-units/core.h include/mp-units/framework.h - include/mp-units/limits.h MODULE_INTERFACE_UNIT mp-units-core.cpp ) diff --git a/src/core/include/mp-units/core.h b/src/core/include/mp-units/core.h index b1c9e6a4..702f3b6b 100644 --- a/src/core/include/mp-units/core.h +++ b/src/core/include/mp-units/core.h @@ -26,7 +26,6 @@ #include #include #include -#include #if MP_UNITS_HOSTED #include diff --git a/src/core/include/mp-units/framework/quantity.h b/src/core/include/mp-units/framework/quantity.h index 3432a626..c5bc36ca 100644 --- a/src/core/include/mp-units/framework/quantity.h +++ b/src/core/include/mp-units/framework/quantity.h @@ -43,6 +43,7 @@ import std; #else #include // IWYU pragma: export +#include #include #endif #endif @@ -670,3 +671,62 @@ struct std::common_type { template requires requires { typename std::common_type; } struct std::common_type : std::common_type {}; + +template + requires requires { typename std::numeric_limits; } +class std::numeric_limits> : public std::numeric_limits { +public: + static constexpr mp_units::quantity min() noexcept + requires requires { mp_units::quantity::min(); } + { + return mp_units::quantity::min(); + } + + static constexpr mp_units::quantity max() noexcept + requires requires { mp_units::quantity::max(); } + { + return mp_units::quantity::max(); + } + + static constexpr mp_units::quantity lowest() noexcept + requires requires { std::numeric_limits::lowest(); } + { + return {std::numeric_limits::lowest(), R}; + } + + static constexpr mp_units::quantity epsilon() noexcept + requires requires { std::numeric_limits::epsilon(); } + { + return {std::numeric_limits::epsilon(), R}; + } + + static constexpr mp_units::quantity round_error() noexcept + requires requires { std::numeric_limits::round_error(); } + { + return {std::numeric_limits::round_error(), R}; + } + + static constexpr mp_units::quantity infinity() noexcept + requires requires { std::numeric_limits::infinity(); } + { + return {std::numeric_limits::infinity(), R}; + } + + static constexpr mp_units::quantity quiet_NaN() noexcept + requires requires { std::numeric_limits::quiet_NaN(); } + { + return {std::numeric_limits::quiet_NaN(), R}; + } + + static constexpr mp_units::quantity signaling_NaN() noexcept + requires requires { std::numeric_limits::signaling_NaN(); } + { + return {std::numeric_limits::signaling_NaN(), R}; + } + + static constexpr mp_units::quantity denorm_min() noexcept + requires requires { std::numeric_limits::denorm_min(); } + { + return {std::numeric_limits::denorm_min(), R}; + } +}; diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index 4a74a97e..a123d032 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -35,6 +35,7 @@ import std; #else #include // IWYU pragma: export +#include #endif #endif @@ -561,3 +562,62 @@ explicit(quantity_point_like_traits::explicit_import) quantity_point(QP) typename quantity_point_like_traits::rep>; } // namespace mp_units + +template + requires requires { typename std::numeric_limits; } +class std::numeric_limits> : public std::numeric_limits { +public: + static constexpr mp_units::quantity_point min() noexcept + requires requires { mp_units::quantity_point::min(); } + { + return mp_units::quantity_point::min(); + } + + static constexpr mp_units::quantity_point max() noexcept + requires requires { mp_units::quantity_point::max(); } + { + return mp_units::quantity_point::max(); + } + + static constexpr mp_units::quantity_point lowest() noexcept + requires requires { std::numeric_limits>::lowest(); } + { + return {std::numeric_limits>::lowest(), PO}; + } + + static constexpr mp_units::quantity_point epsilon() noexcept + requires requires { std::numeric_limits>::epsilon(); } + { + return {std::numeric_limits>::epsilon(), PO}; + } + + static constexpr mp_units::quantity_point round_error() noexcept + requires requires { std::numeric_limits>::round_error(); } + { + return {std::numeric_limits>::round_error(), PO}; + } + + static constexpr mp_units::quantity_point infinity() noexcept + requires requires { std::numeric_limits>::infinity(); } + { + return {std::numeric_limits>::infinity(), PO}; + } + + static constexpr mp_units::quantity_point quiet_NaN() noexcept + requires requires { std::numeric_limits>::quiet_NaN(); } + { + return {std::numeric_limits>::quiet_NaN(), PO}; + } + + static constexpr mp_units::quantity_point signaling_NaN() noexcept + requires requires { std::numeric_limits>::signaling_NaN(); } + { + return {std::numeric_limits>::signaling_NaN(), PO}; + } + + static constexpr mp_units::quantity_point denorm_min() noexcept + requires requires { std::numeric_limits>::denorm_min(); } + { + return {std::numeric_limits>::denorm_min(), PO}; + } +}; diff --git a/src/core/include/mp-units/limits.h b/src/core/include/mp-units/limits.h deleted file mode 100644 index e04cf49d..00000000 --- a/src/core/include/mp-units/limits.h +++ /dev/null @@ -1,154 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2018 Mateusz Pusz -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -#pragma once - -#include -#include -#include - -#ifndef MP_UNITS_IN_MODULE_INTERFACE -#ifdef MP_UNITS_IMPORT_STD -import std; -#else -#include -#endif // MP_UNITS_IMPORT_STD -#endif // MP_UNITS_IN_MODULE_INTERFACE - -template - requires requires { typename std::numeric_limits; } -class std::numeric_limits> : public std::numeric_limits { -public: - static constexpr mp_units::quantity min() noexcept - requires requires { mp_units::quantity::min(); } - { - return mp_units::quantity::min(); - } - - static constexpr mp_units::quantity max() noexcept - requires requires { mp_units::quantity::max(); } - { - return mp_units::quantity::max(); - } - - static constexpr mp_units::quantity lowest() noexcept - requires requires { std::numeric_limits::lowest(); } - { - return {std::numeric_limits::lowest(), R}; - } - - static constexpr mp_units::quantity epsilon() noexcept - requires requires { std::numeric_limits::epsilon(); } - { - return {std::numeric_limits::epsilon(), R}; - } - - static constexpr mp_units::quantity round_error() noexcept - requires requires { std::numeric_limits::round_error(); } - { - return {std::numeric_limits::round_error(), R}; - } - - static constexpr mp_units::quantity infinity() noexcept - requires requires { std::numeric_limits::infinity(); } - { - return {std::numeric_limits::infinity(), R}; - } - - static constexpr mp_units::quantity quiet_NaN() noexcept - requires requires { std::numeric_limits::quiet_NaN(); } - { - return {std::numeric_limits::quiet_NaN(), R}; - } - - static constexpr mp_units::quantity signaling_NaN() noexcept - requires requires { std::numeric_limits::signaling_NaN(); } - { - return {std::numeric_limits::signaling_NaN(), R}; - } - - static constexpr mp_units::quantity denorm_min() noexcept - requires requires { std::numeric_limits::denorm_min(); } - { - return {std::numeric_limits::denorm_min(), R}; - } -}; - - -template - requires requires { typename std::numeric_limits; } -class std::numeric_limits> : public std::numeric_limits { -public: - static constexpr mp_units::quantity_point min() noexcept - requires requires { mp_units::quantity_point::min(); } - { - return mp_units::quantity_point::min(); - } - - static constexpr mp_units::quantity_point max() noexcept - requires requires { mp_units::quantity_point::max(); } - { - return mp_units::quantity_point::max(); - } - - static constexpr mp_units::quantity_point lowest() noexcept - requires requires { std::numeric_limits>::lowest(); } - { - return {std::numeric_limits>::lowest(), PO}; - } - - static constexpr mp_units::quantity_point epsilon() noexcept - requires requires { std::numeric_limits>::epsilon(); } - { - return {std::numeric_limits>::epsilon(), PO}; - } - - static constexpr mp_units::quantity_point round_error() noexcept - requires requires { std::numeric_limits>::round_error(); } - { - return {std::numeric_limits>::round_error(), PO}; - } - - static constexpr mp_units::quantity_point infinity() noexcept - requires requires { std::numeric_limits>::infinity(); } - { - return {std::numeric_limits>::infinity(), PO}; - } - - static constexpr mp_units::quantity_point quiet_NaN() noexcept - requires requires { std::numeric_limits>::quiet_NaN(); } - { - return {std::numeric_limits>::quiet_NaN(), PO}; - } - - static constexpr mp_units::quantity_point signaling_NaN() noexcept - requires requires { std::numeric_limits>::signaling_NaN(); } - { - return {std::numeric_limits>::signaling_NaN(), PO}; - } - - static constexpr mp_units::quantity_point denorm_min() noexcept - requires requires { std::numeric_limits>::denorm_min(); } - { - return {std::numeric_limits>::denorm_min(), PO}; - } -}; diff --git a/test/static/limits_test.cpp b/test/static/limits_test.cpp index 7338fab3..5bcd6d6a 100644 --- a/test/static/limits_test.cpp +++ b/test/static/limits_test.cpp @@ -20,7 +20,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include #include #ifdef MP_UNITS_IMPORT_STD import std;