1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_TO_VECTOR_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_CONTAINERS_TO_VECTOR_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <functional> 9*6777b538SAndroid Build Coastguard Worker #include <iterator> 10*6777b538SAndroid Build Coastguard Worker #include <type_traits> 11*6777b538SAndroid Build Coastguard Worker #include <utility> 12*6777b538SAndroid Build Coastguard Worker #include <vector> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/ranges/ranges.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace base { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker // Maps a container to a std::vector<> with respect to the provided projection. 20*6777b538SAndroid Build Coastguard Worker // The deduced vector element type is equal to the projection's return type with 21*6777b538SAndroid Build Coastguard Worker // cv-qualifiers removed. 22*6777b538SAndroid Build Coastguard Worker // 23*6777b538SAndroid Build Coastguard Worker // In C++20 this is roughly equal to: 24*6777b538SAndroid Build Coastguard Worker // auto vec = range | std::views:transform(proj) | 25*6777b538SAndroid Build Coastguard Worker // std::ranges::to<std::vector>; 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // Complexity: Exactly `size(range)` applications of `proj`. 28*6777b538SAndroid Build Coastguard Worker template <typename Range, typename Proj = std::identity> 29*6777b538SAndroid Build Coastguard Worker requires requires { typename internal::range_category_t<Range>; } && 30*6777b538SAndroid Build Coastguard Worker std::indirectly_unary_invocable<Proj, ranges::iterator_t<Range>> 31*6777b538SAndroid Build Coastguard Worker auto ToVector(Range&& range, Proj proj = {}) { 32*6777b538SAndroid Build Coastguard Worker using ProjectedType = 33*6777b538SAndroid Build Coastguard Worker std::projected<ranges::iterator_t<Range>, Proj>::value_type; 34*6777b538SAndroid Build Coastguard Worker std::vector<ProjectedType> container; 35*6777b538SAndroid Build Coastguard Worker container.reserve(std::size(range)); 36*6777b538SAndroid Build Coastguard Worker ranges::transform(std::forward<Range>(range), std::back_inserter(container), 37*6777b538SAndroid Build Coastguard Worker std::move(proj)); 38*6777b538SAndroid Build Coastguard Worker return container; 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace base 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker #endif // BASE_CONTAINERS_TO_VECTOR_H_ 44