blob: a1f080955e6104ffde5e157cbe08120ffe92e13f [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_TEST_TO_VECTOR_H_
#define BASE_TEST_TO_VECTOR_H_
#include <functional>
#include <iterator>
#include <type_traits>
#include <utility>
#include <vector>
#include "base/ranges/algorithm.h"
#include "base/template_util.h"
namespace base::test {
// A handy helper for mapping any container into an std::vector<> with respect
// to the provided projection. The deduced vector element type is equal to the
// projection's return type with cv-qualifiers removed.
//
// In C++20 this is roughly equal to:
// auto vec = range | views:transform(proj) | ranges::to<std::vector>;
//
// Complexity: Exactly `size(range)` applications of `proj`.
template <typename Range, typename Proj = std::identity>
auto ToVector(Range&& range, Proj proj = {}) {
using ProjectedType =
std::invoke_result_t<Proj, decltype(*std::begin(range))>;
std::vector<base::remove_cvref_t<ProjectedType>> container;
container.reserve(std::size(range));
base::ranges::transform(std::forward<Range>(range),
std::back_inserter(container), std::move(proj));
return container;
}
} // namespace base::test
#endif // BASE_TEST_TO_VECTOR_H_