mirror of
https://github.com/Kitware/CMake.git
synced 2026-06-24 08:47:59 +00:00
cmext/algorithm: Fix return type of cm::keys and cm::values
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user