]> git.proxmox.com Git - ceph.git/blame - ceph/src/arrow/cpp/src/arrow/util/vector.h
import quincy 17.2.0
[ceph.git] / ceph / src / arrow / cpp / src / arrow / util / vector.h
CommitLineData
1d09f67e
TL
1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements. See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership. The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18#pragma once
19
20#include <algorithm>
21#include <utility>
22#include <vector>
23
24#include "arrow/result.h"
25#include "arrow/util/algorithm.h"
26#include "arrow/util/functional.h"
27#include "arrow/util/logging.h"
28
29namespace arrow {
30namespace internal {
31
32template <typename T>
33std::vector<T> DeleteVectorElement(const std::vector<T>& values, size_t index) {
34 DCHECK(!values.empty());
35 DCHECK_LT(index, values.size());
36 std::vector<T> out;
37 out.reserve(values.size() - 1);
38 for (size_t i = 0; i < index; ++i) {
39 out.push_back(values[i]);
40 }
41 for (size_t i = index + 1; i < values.size(); ++i) {
42 out.push_back(values[i]);
43 }
44 return out;
45}
46
47template <typename T>
48std::vector<T> AddVectorElement(const std::vector<T>& values, size_t index,
49 T new_element) {
50 DCHECK_LE(index, values.size());
51 std::vector<T> out;
52 out.reserve(values.size() + 1);
53 for (size_t i = 0; i < index; ++i) {
54 out.push_back(values[i]);
55 }
56 out.emplace_back(std::move(new_element));
57 for (size_t i = index; i < values.size(); ++i) {
58 out.push_back(values[i]);
59 }
60 return out;
61}
62
63template <typename T>
64std::vector<T> ReplaceVectorElement(const std::vector<T>& values, size_t index,
65 T new_element) {
66 DCHECK_LE(index, values.size());
67 std::vector<T> out;
68 out.reserve(values.size());
69 for (size_t i = 0; i < index; ++i) {
70 out.push_back(values[i]);
71 }
72 out.emplace_back(std::move(new_element));
73 for (size_t i = index + 1; i < values.size(); ++i) {
74 out.push_back(values[i]);
75 }
76 return out;
77}
78
79template <typename T, typename Predicate>
80std::vector<T> FilterVector(std::vector<T> values, Predicate&& predicate) {
81 auto new_end =
82 std::remove_if(values.begin(), values.end(), std::forward<Predicate>(predicate));
83 values.erase(new_end, values.end());
84 return values;
85}
86
87template <typename Fn, typename From,
88 typename To = decltype(std::declval<Fn>()(std::declval<From>()))>
89std::vector<To> MapVector(Fn&& map, const std::vector<From>& source) {
90 std::vector<To> out;
91 out.reserve(source.size());
92 std::transform(source.begin(), source.end(), std::back_inserter(out),
93 std::forward<Fn>(map));
94 return out;
95}
96
97template <typename Fn, typename From,
98 typename To = decltype(std::declval<Fn>()(std::declval<From>()))>
99std::vector<To> MapVector(Fn&& map, std::vector<From>&& source) {
100 std::vector<To> out;
101 out.reserve(source.size());
102 std::transform(std::make_move_iterator(source.begin()),
103 std::make_move_iterator(source.end()), std::back_inserter(out),
104 std::forward<Fn>(map));
105 return out;
106}
107
108/// \brief Like MapVector, but where the function can fail.
109template <typename Fn, typename From = internal::call_traits::argument_type<0, Fn>,
110 typename To = typename internal::call_traits::return_type<Fn>::ValueType>
111Result<std::vector<To>> MaybeMapVector(Fn&& map, const std::vector<From>& source) {
112 std::vector<To> out;
113 out.reserve(source.size());
114 ARROW_RETURN_NOT_OK(MaybeTransform(source.begin(), source.end(),
115 std::back_inserter(out), std::forward<Fn>(map)));
116 return std::move(out);
117}
118
119template <typename Fn, typename From = internal::call_traits::argument_type<0, Fn>,
120 typename To = typename internal::call_traits::return_type<Fn>::ValueType>
121Result<std::vector<To>> MaybeMapVector(Fn&& map, std::vector<From>&& source) {
122 std::vector<To> out;
123 out.reserve(source.size());
124 ARROW_RETURN_NOT_OK(MaybeTransform(std::make_move_iterator(source.begin()),
125 std::make_move_iterator(source.end()),
126 std::back_inserter(out), std::forward<Fn>(map)));
127 return std::move(out);
128}
129
130template <typename T>
131std::vector<T> FlattenVectors(const std::vector<std::vector<T>>& vecs) {
132 std::size_t sum = 0;
133 for (const auto& vec : vecs) {
134 sum += vec.size();
135 }
136 std::vector<T> out;
137 out.reserve(sum);
138 for (const auto& vec : vecs) {
139 out.insert(out.end(), vec.begin(), vec.end());
140 }
141 return out;
142}
143
144template <typename T>
145Result<std::vector<T>> UnwrapOrRaise(std::vector<Result<T>>&& results) {
146 std::vector<T> out;
147 out.reserve(results.size());
148 auto end = std::make_move_iterator(results.end());
149 for (auto it = std::make_move_iterator(results.begin()); it != end; it++) {
150 if (!it->ok()) {
151 return it->status();
152 }
153 out.push_back(it->MoveValueUnsafe());
154 }
155 return std::move(out);
156}
157
158template <typename T>
159Result<std::vector<T>> UnwrapOrRaise(const std::vector<Result<T>>& results) {
160 std::vector<T> out;
161 out.reserve(results.size());
162 for (const auto& result : results) {
163 if (!result.ok()) {
164 return result.status();
165 }
166 out.push_back(result.ValueUnsafe());
167 }
168 return std::move(out);
169}
170
171} // namespace internal
172} // namespace arrow