From a5882e9abe359ffc24a3233c3e2472f8b3e9b6f5 Mon Sep 17 00:00:00 2001 From: Marc Chevrier Date: Tue, 17 Mar 2026 16:02:16 +0100 Subject: [PATCH] cmext/algorithm: Fix return type of cm::keys and cm::values --- Tests/CMakeLib/testCMExtAlgorithm.cxx | 71 +++++++++++++++++++++++++++ Utilities/std/cm/ranges | 2 +- Utilities/std/cmext/algorithm | 32 +++++++----- 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/Tests/CMakeLib/testCMExtAlgorithm.cxx b/Tests/CMakeLib/testCMExtAlgorithm.cxx index 53b0302a09..0f00bd3ca4 100644 --- a/Tests/CMakeLib/testCMExtAlgorithm.cxx +++ b/Tests/CMakeLib/testCMExtAlgorithm.cxx @@ -1,5 +1,8 @@ #include +#include #include +#include +#include #include #include @@ -107,11 +110,79 @@ void testAppend() } } } + +void testKeys() +{ + { + std::map m{ { "one", 1 }, { "two", 2 } }; + std::vector ref{ "one", "two" }; + + auto res = cm::keys(m); + if (res != ref) { + ++failed; + } + } + { + std::map m{ { 1, 1 }, { 2, 2 } }; + std::vector ref{ 1, 2 }; + + auto res = cm::keys(m); + if (res != ref) { + ++failed; + } + } + { + std::vector> m; + m.emplace_back("one", 1, 10); + m.emplace_back("two", 2, 20); + std::vector ref{ "one", "two" }; + + auto res = cm::keys(m); + if (res != ref) { + ++failed; + } + } +} + +void testValues() +{ + { + std::map m{ { "one", 1 }, { "two", 2 } }; + std::vector ref{ 1, 2 }; + + auto res = cm::values(m); + if (res != ref) { + ++failed; + } + } + { + std::map m{ { 1, "one" }, { 2, "two" } }; + std::vector ref{ "one", "two" }; + + auto res = cm::values(m); + if (res != ref) { + ++failed; + } + } + { + std::vector> m; + m.emplace_back("one", 1, 10); + m.emplace_back("two", 2, 20); + std::vector ref{ 1, 2 }; + + auto res = cm::values(m); + if (res != ref) { + ++failed; + } + } +} } int testCMExtAlgorithm(int /*unused*/, char* /*unused*/[]) { testAppend(); + testKeys(); + testValues(); return failed; } diff --git a/Utilities/std/cm/ranges b/Utilities/std/cm/ranges index 799399816e..54ab47b170 100644 --- a/Utilities/std/cm/ranges +++ b/Utilities/std/cm/ranges @@ -102,7 +102,7 @@ template ::value, int> = 0> std::vector::type> -keys(Range const& range) +values(Range const& range) { using value_type = typename std::tuple_element<1, typename Range::value_type>::type; diff --git a/Utilities/std/cmext/algorithm b/Utilities/std/cmext/algorithm index 327a7721f1..2aa1ec5ff6 100644 --- a/Utilities/std/cmext/algorithm +++ b/Utilities/std/cmext/algorithm @@ -260,12 +260,13 @@ template < std::vector keys(Range const& range) { #if defined(CMake_HAVE_CXX_RANGES) + using key_type = typename Range::key_type; + # if __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202302L) - return std::vector{ std::from_range, - std::views::keys(range) }; + return std::vector{ std::from_range, std::views::keys(range) }; # else auto view = std::views::keys(range); - return std::vector{ view.begin(), view.end() }; + return std::vector{ view.begin(), view.end() }; # endif #else return cm::views::keys(range); @@ -280,12 +281,13 @@ template < std::vector values(Range const& range) { #if defined(CMake_HAVE_CXX_RANGES) + using value_type = typename Range::mapped_type; + # if __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202302L) - return std::vector{ std::from_range, - std::views::values(range) }; + return std::vector{ std::from_range, std::views::values(range) }; # else auto view = std::views::values(range); - return std::vector{ view.begin(), view.end() }; + return std::vector{ view.begin(), view.end() }; # endif #else return cm::views::values(range); @@ -301,12 +303,14 @@ std::vector::type> keys(Range const& range) { #if defined(CMake_HAVE_CXX_RANGES) + using key_type = + typename std::tuple_element<0, typename Range::value_type>::type; + # if __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202302L) - return std::vector{ std::from_range, - std::views::keys(range) }; + return std::vector{ std::from_range, std::views::keys(range) }; # else auto view = std::views::keys(range); - return std::vector{ view.begin(), view.end() }; + return std::vector{ view.begin(), view.end() }; # endif #else return cm::views::keys(range); @@ -318,15 +322,17 @@ template ::value, int> = 0> std::vector::type> -keys(Range const& range) +values(Range const& range) { #if defined(CMake_HAVE_CXX_RANGES) + using value_type = + typename std::tuple_element<1, typename Range::value_type>::type; + # if __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202302L) - return std::vector{ std::from_range, - std::views::values(range) }; + return std::vector{ std::from_range, std::views::values(range) }; # else auto view = std::views::values(range); - return std::vector{ view.begin(), view.end() }; + return std::vector{ view.begin(), view.end() }; # endif #else return cm::views::values(range);