[libcxx-commits] [libcxx] [libcxx] adds ranges::fold_left_with_iter and ranges::fold_left (PR #75259)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Dec 14 17:40:07 PST 2023


================
@@ -0,0 +1,116 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <algorithm>
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+
+// template<input_iterator I, sentinel_for<I> S, class T,
+//          indirectly-binary-left-foldable<T, I> F>
+//   constexpr see below ranges::fold_left_with_iter(I first, S last, T init, F f);
+//
+// template<input_range R, class T, indirectly-binary-left-foldable<T, iterator_t<R>> F>
+//   constexpr see below ranges::fold_left_with_iter(R&& r, T init, F f);
+
+#include <algorithm>
+#include <cassert>
+#include <vector>
+#include <functional>
+
+#include "test_range.h"
+#include "../gaussian_sum.h"
+
+constexpr bool test() {
----------------
EricWF wrote:

* Please add more tests for (1). What if we're dereferencing the first iterator? In all those cases that's valid because it's actually backed by an element.

(3) What's the purpose of wrapping the binary functor in `std::ref`? To prevent it from being copied repeatedly in case it has state. It would be a meaningful regression were we to start copying the binary operator more.

(6) Almost all of the tests are over contiguous ranges of densely packed objects. So code using more opaque or non-contiguous iterators will compile entirely differently, have wildly different memory access patterns, and could tickle all sorts of bugs we don't know we have. 




https://github.com/llvm/llvm-project/pull/75259


More information about the libcxx-commits mailing list