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

This commit is contained in:
Marc Chevrier
2026-03-17 16:02:16 +01:00
parent 087e27a61d
commit a5882e9abe
3 changed files with 91 additions and 14 deletions

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;
}

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;

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);