Merge topic 'cmext-algorithm-keys'

a5882e9abe cmext/algorithm: Fix return type of cm::keys and cm::values

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !11828
This commit is contained in:
Brad King authored and Kitware Robot committed 2026-03-20 08:40:05 -04:00
commit 263443ca85
3 files changed
+91 -14

No files matched your search

+71
View File
@@ -1,5 +1,8 @@
#include <iostream>
#include <map>
#include <memory>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
@@ -107,11 +110,79 @@ void testAppend()
}
}
}
void testKeys()
{
{
std::map<std::string, int> m{ { "one", 1 }, { "two", 2 } };
std::vector<std::string> ref{ "one", "two" };
auto res = cm::keys(m);
if (res != ref) {
++failed;
}
}
{
std::map<int, int> m{ { 1, 1 }, { 2, 2 } };
std::vector<int> ref{ 1, 2 };
auto res = cm::keys(m);
if (res != ref) {
++failed;
}
}
{
std::vector<std::tuple<std::string, int, int>> m;
m.emplace_back("one", 1, 10);
m.emplace_back("two", 2, 20);
std::vector<std::string> ref{ "one", "two" };
auto res = cm::keys(m);
if (res != ref) {
++failed;
}
}
}
void testValues()
{
{
std::map<std::string, int> m{ { "one", 1 }, { "two", 2 } };
std::vector<int> ref{ 1, 2 };
auto res = cm::values(m);
if (res != ref) {
++failed;
}
}
{
std::map<int, std::string> m{ { 1, "one" }, { 2, "two" } };
std::vector<std::string> ref{ "one", "two" };
auto res = cm::values(m);
if (res != ref) {
++failed;
}
}
{
std::vector<std::tuple<std::string, int, int>> m;
m.emplace_back("one", 1, 10);
m.emplace_back("two", 2, 20);
std::vector<int> ref{ 1, 2 };
auto res = cm::values(m);
if (res != ref) {
++failed;
}
}
}
}
int testCMExtAlgorithm(int /*unused*/, char* /*unused*/[])
{
testAppend();
testKeys();
testValues();
return failed;
}
+1 -1
View File
@@ -102,7 +102,7 @@ template <typename Range,
cm::is_tuple<2, typename Range::value_type>::value,
int> = 0>
std::vector<typename std::tuple_element<1, typename Range::value_type>::type>
keys(Range const& range)
values(Range const& range)
{
using value_type =
typename std::tuple_element<1, typename Range::value_type>::type;
+19 -13
View File
@@ -260,12 +260,13 @@ template <
std::vector<typename Range::key_type> 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::string_view>{ std::from_range,
std::views::keys(range) };
return std::vector<key_type>{ std::from_range, std::views::keys(range) };
# else
auto view = std::views::keys(range);
return std::vector<std::string_view>{ view.begin(), view.end() };
return std::vector<key_type>{ view.begin(), view.end() };
# endif
#else
return cm::views::keys(range);
@@ -280,12 +281,13 @@ template <
std::vector<typename Range::mapped_type> 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::string_view>{ std::from_range,
std::views::values(range) };
return std::vector<value_type>{ std::from_range, std::views::values(range) };
# else
auto view = std::views::values(range);
return std::vector<std::string_view>{ view.begin(), view.end() };
return std::vector<value_type>{ view.begin(), view.end() };
# endif
#else
return cm::views::values(range);
@@ -301,12 +303,14 @@ std::vector<typename std::tuple_element<0, typename Range::value_type>::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::string_view>{ std::from_range,
std::views::keys(range) };
return std::vector<key_type>{ std::from_range, std::views::keys(range) };
# else
auto view = std::views::keys(range);
return std::vector<std::string_view>{ view.begin(), view.end() };
return std::vector<key_type>{ view.begin(), view.end() };
# endif
#else
return cm::views::keys(range);
@@ -318,15 +322,17 @@ template <typename Range,
cm::is_tuple<2, typename Range::value_type>::value,
int> = 0>
std::vector<typename std::tuple_element<1, typename Range::value_type>::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::string_view>{ std::from_range,
std::views::values(range) };
return std::vector<value_type>{ std::from_range, std::views::values(range) };
# else
auto view = std::views::values(range);
return std::vector<std::string_view>{ view.begin(), view.end() };
return std::vector<value_type>{ view.begin(), view.end() };
# endif
#else
return cm::views::values(range);