File indexing completed on 2025-08-28 08:27:11
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #pragma once
0019
0020 #include <algorithm>
0021 #include <utility>
0022 #include <vector>
0023
0024 #include "arrow/result.h"
0025 #include "arrow/util/algorithm.h"
0026 #include "arrow/util/functional.h"
0027 #include "arrow/util/logging.h"
0028
0029 namespace arrow {
0030 namespace internal {
0031
0032 template <typename T>
0033 std::vector<T> DeleteVectorElement(const std::vector<T>& values, size_t index) {
0034 ARROW_DCHECK(!values.empty());
0035 ARROW_DCHECK_LT(index, values.size());
0036 std::vector<T> out;
0037 out.reserve(values.size() - 1);
0038 for (size_t i = 0; i < index; ++i) {
0039 out.push_back(values[i]);
0040 }
0041 for (size_t i = index + 1; i < values.size(); ++i) {
0042 out.push_back(values[i]);
0043 }
0044 return out;
0045 }
0046
0047 template <typename T>
0048 std::vector<T> AddVectorElement(const std::vector<T>& values, size_t index,
0049 T new_element) {
0050 ARROW_DCHECK_LE(index, values.size());
0051 std::vector<T> out;
0052 out.reserve(values.size() + 1);
0053 for (size_t i = 0; i < index; ++i) {
0054 out.push_back(values[i]);
0055 }
0056 out.emplace_back(std::move(new_element));
0057 for (size_t i = index; i < values.size(); ++i) {
0058 out.push_back(values[i]);
0059 }
0060 return out;
0061 }
0062
0063 template <typename T>
0064 std::vector<T> ReplaceVectorElement(const std::vector<T>& values, size_t index,
0065 T new_element) {
0066 ARROW_DCHECK_LE(index, values.size());
0067 std::vector<T> out;
0068 out.reserve(values.size());
0069 for (size_t i = 0; i < index; ++i) {
0070 out.push_back(values[i]);
0071 }
0072 out.emplace_back(std::move(new_element));
0073 for (size_t i = index + 1; i < values.size(); ++i) {
0074 out.push_back(values[i]);
0075 }
0076 return out;
0077 }
0078
0079 template <typename T, typename Predicate>
0080 std::vector<T> FilterVector(std::vector<T> values, Predicate&& predicate) {
0081 auto new_end = std::remove_if(values.begin(), values.end(),
0082 [&](const T& value) { return !predicate(value); });
0083 values.erase(new_end, values.end());
0084 return values;
0085 }
0086
0087 template <typename Fn, typename From,
0088 typename To = decltype(std::declval<Fn>()(std::declval<From>()))>
0089 std::vector<To> MapVector(Fn&& map, const std::vector<From>& source) {
0090 std::vector<To> out;
0091 out.reserve(source.size());
0092 std::transform(source.begin(), source.end(), std::back_inserter(out),
0093 std::forward<Fn>(map));
0094 return out;
0095 }
0096
0097 template <typename Fn, typename From,
0098 typename To = decltype(std::declval<Fn>()(std::declval<From>()))>
0099 std::vector<To> MapVector(Fn&& map, std::vector<From>&& source) {
0100 std::vector<To> out;
0101 out.reserve(source.size());
0102 std::transform(std::make_move_iterator(source.begin()),
0103 std::make_move_iterator(source.end()), std::back_inserter(out),
0104 std::forward<Fn>(map));
0105 return out;
0106 }
0107
0108
0109 template <typename Fn, typename From = internal::call_traits::argument_type<0, Fn>,
0110 typename To = typename internal::call_traits::return_type<Fn>::ValueType>
0111 Result<std::vector<To>> MaybeMapVector(Fn&& map, const std::vector<From>& source) {
0112 std::vector<To> out;
0113 out.reserve(source.size());
0114 ARROW_RETURN_NOT_OK(MaybeTransform(source.begin(), source.end(),
0115 std::back_inserter(out), std::forward<Fn>(map)));
0116 return out;
0117 }
0118
0119 template <typename Fn, typename From = internal::call_traits::argument_type<0, Fn>,
0120 typename To = typename internal::call_traits::return_type<Fn>::ValueType>
0121 Result<std::vector<To>> MaybeMapVector(Fn&& map, std::vector<From>&& source) {
0122 std::vector<To> out;
0123 out.reserve(source.size());
0124 ARROW_RETURN_NOT_OK(MaybeTransform(std::make_move_iterator(source.begin()),
0125 std::make_move_iterator(source.end()),
0126 std::back_inserter(out), std::forward<Fn>(map)));
0127 return std::move(out);
0128 }
0129
0130 template <typename T>
0131 std::vector<T> FlattenVectors(const std::vector<std::vector<T>>& vecs) {
0132 std::size_t sum = 0;
0133 for (const auto& vec : vecs) {
0134 sum += vec.size();
0135 }
0136 std::vector<T> out;
0137 out.reserve(sum);
0138 for (const auto& vec : vecs) {
0139 out.insert(out.end(), vec.begin(), vec.end());
0140 }
0141 return out;
0142 }
0143
0144 template <typename T>
0145 Result<std::vector<T>> UnwrapOrRaise(std::vector<Result<T>>&& results) {
0146 std::vector<T> out;
0147 out.reserve(results.size());
0148 auto end = std::make_move_iterator(results.end());
0149 for (auto it = std::make_move_iterator(results.begin()); it != end; it++) {
0150 if (!it->ok()) {
0151 return it->status();
0152 }
0153 out.push_back(it->MoveValueUnsafe());
0154 }
0155 return out;
0156 }
0157
0158 template <typename T>
0159 Result<std::vector<T>> UnwrapOrRaise(const std::vector<Result<T>>& results) {
0160 std::vector<T> out;
0161 out.reserve(results.size());
0162 for (const auto& result : results) {
0163 if (!result.ok()) {
0164 return result.status();
0165 }
0166 out.push_back(result.ValueUnsafe());
0167 }
0168 return out;
0169 }
0170
0171 }
0172 }