Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-08-28 08:27:11

0001 // Licensed to the Apache Software Foundation (ASF) under one
0002 // or more contributor license agreements.  See the NOTICE file
0003 // distributed with this work for additional information
0004 // regarding copyright ownership.  The ASF licenses this file
0005 // to you under the Apache License, Version 2.0 (the
0006 // "License"); you may not use this file except in compliance
0007 // with the License.  You may obtain a copy of the License at
0008 //
0009 //   http://www.apache.org/licenses/LICENSE-2.0
0010 //
0011 // Unless required by applicable law or agreed to in writing,
0012 // software distributed under the License is distributed on an
0013 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
0014 // KIND, either express or implied.  See the License for the
0015 // specific language governing permissions and limitations
0016 // under the License.
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 /// \brief Like MapVector, but where the function can fail.
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 }  // namespace internal
0172 }  // namespace arrow