diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e3ac12c..21bf11b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,7 @@ if(${projectPrefix}IWYU) MAX_LINE_LENGTH 120 NO_COMMENTS ) - if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(${projectPrefix}AS_SYSTEM_HEADERS ON) endif() endif() diff --git a/conanfile.py b/conanfile.py index 7bddf441..17b0d4e4 100644 --- a/conanfile.py +++ b/conanfile.py @@ -70,6 +70,12 @@ class UnitsConan(ConanFile): (compiler == "msvc" and (version == "19.3" or version >= "19.30") and compiler.cppstd == 23) return not std_support + @property + def _use_range_v3(self): + compiler = self.settings.compiler + version = Version(self.settings.compiler.version) + return ("clang" in compiler and compiler.libcxx == "libc++" and version < "14.0") + def set_version(self): content = tools.load(os.path.join(self.recipe_folder, "src/CMakeLists.txt")) version = re.search(r"project\([^\)]+VERSION (\d+\.\d+\.\d+)[^\)]*\)", content).group(1) @@ -79,9 +85,9 @@ class UnitsConan(ConanFile): compiler = self.settings.compiler version = Version(self.settings.compiler.version) if self._use_libfmt: - self.requires("fmt/8.0.1") + self.requires("fmt/8.1.1") - if compiler == "clang" and compiler.libcxx == "libc++" and version < "14.0": + if self._use_range_v3: self.requires("range-v3/0.11.0") def build_requirements(self): @@ -100,6 +106,9 @@ class UnitsConan(ConanFile): elif compiler == "clang": if version < "12": raise ConanInvalidConfiguration("mp-units requires at least clang++-12") + elif compiler == "apple-clang": + if version < "13": + raise ConanInvalidConfiguration("mp-units requires at least AppleClang 13") elif compiler == "Visual Studio": if version < "16": raise ConanInvalidConfiguration("mp-units requires at least Visual Studio 16.9") @@ -148,7 +157,7 @@ class UnitsConan(ConanFile): self.cpp_info.components["core"].requires = ["gsl-lite::gsl-lite"] if compiler == "Visual Studio": self.cpp_info.components["core"].cxxflags = ["/utf-8"] - elif compiler == "clang" and compiler.libcxx == "libc++": + if self._use_range_v3: self.cpp_info.components["core"].requires.append("range-v3::range-v3") # rest diff --git a/docs/index.rst b/docs/index.rst index 948b8df2..0cfb607f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -21,6 +21,7 @@ with a permissive `MIT license $ ) -if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(${projectPrefix}LIBCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "14") find_package(range-v3 CONFIG REQUIRED) target_link_libraries(mp-units-core INTERFACE range-v3::range-v3) diff --git a/src/core/include/units/bits/derived_unit.h b/src/core/include/units/bits/derived_unit.h index f65b2fdd..097a08c2 100644 --- a/src/core/include/units/bits/derived_unit.h +++ b/src/core/include/units/bits/derived_unit.h @@ -47,7 +47,7 @@ constexpr ratio inverse_if_negative(const ratio& r) template constexpr ratio derived_ratio(exponent_list) { - return (... * inverse_if_negative(pow(Us::ratio) / dimension_unit::ratio)); + return (... * inverse_if_negative(pow(Us::ratio / dimension_unit::ratio))); } template diff --git a/src/core/include/units/bits/external/hacks.h b/src/core/include/units/bits/external/hacks.h index 1db8e7de..3826ae44 100644 --- a/src/core/include/units/bits/external/hacks.h +++ b/src/core/include/units/bits/external/hacks.h @@ -63,18 +63,13 @@ #define UNITS_DIAGNOSTIC_IGNORE_UNREACHABLE UNITS_DIAGNOSTIC_IGNORE(4702) #endif -#if UNITS_COMP_CLANG - -#include #if _LIBCPP_VERSION #define UNITS_LIBCXX _LIBCPP_VERSION #endif -#endif - #if UNITS_LIBCXX -#if UNITS_COMP_CLANG == 12 +#if UNITS_LIBCXX < 13000 #include #include @@ -84,7 +79,7 @@ #include #include -#elif UNITS_COMP_CLANG == 13 +#elif UNITS_LIBCXX < 14000 #include @@ -115,7 +110,7 @@ concept default_constructible = constructible_from; #elif UNITS_LIBCXX -#if UNITS_COMP_CLANG == 12 +#if UNITS_LIBCXX < 13000 // concepts using concepts::common_with; @@ -228,7 +223,7 @@ constexpr bool in_range(T t) noexcept std::cmp_less_equal(t, std::numeric_limits::max()); } -#elif UNITS_COMP_CLANG == 13 +#elif UNITS_LIBCXX < 14000 using concepts::three_way_comparable; using concepts::three_way_comparable_with; diff --git a/src/core/include/units/magnitude.h b/src/core/include/units/magnitude.h index eed32e16..eb6278e4 100644 --- a/src/core/include/units/magnitude.h +++ b/src/core/include/units/magnitude.h @@ -363,16 +363,6 @@ concept Magnitude = detail::is_magnitude; template T get_value(Magnitude auto m) { return m.template value; } -/** - * @brief Convert any positive integer to a Magnitude. - * - * This will be the main way end users create Magnitudes. They should rarely (if ever) create a magnitude<...> by - * manually adding base powers. - */ -template - requires (R.num > 0) -constexpr Magnitude auto as_magnitude(); - /** * @brief A base to represent pi. */ diff --git a/src/mp-unitsConfig.cmake b/src/mp-unitsConfig.cmake index afe3f7a1..8b63a787 100644 --- a/src/mp-unitsConfig.cmake +++ b/src/mp-unitsConfig.cmake @@ -21,7 +21,7 @@ # SOFTWARE. function(__check_libcxx_in_use variable) - if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") message(CHECK_START "Checking if libc++ is being used") list(APPEND CMAKE_MESSAGE_INDENT " ") @@ -43,7 +43,7 @@ find_dependency(fmt) find_dependency(gsl-lite) # add range-v3 dependency only for clang + libc++ -if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") __check_libcxx_in_use(__units_libcxx) if(__units_libcxx AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "14") find_dependency(range-v3) diff --git a/test/unit_test/static/fps_test.cpp b/test/unit_test/static/fps_test.cpp index 1eb7e541..74ddd60e 100644 --- a/test/unit_test/static/fps_test.cpp +++ b/test/unit_test/static/fps_test.cpp @@ -59,6 +59,10 @@ static_assert(100_q_ft2 / 10_q_ft == 10_q_ft); static_assert(detail::unit_text() == basic_symbol_text("ft²", "ft^2")); +// volume +static_assert(1_q_yd * 1_q_yd * 1_q_yd == 1_q_yd3); +static_assert(cubic_yard::ratio / cubic_foot::ratio == ratio(27)); + /* ************** DERIVED DIMENSIONS WITH NAMED UNITS **************** */ // acceleration