[libcxx-commits] [libcxx] [libc++] Implement a type-safe iterator for optional (PR #154239)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jan 14 14:07:26 PST 2026


================
@@ -0,0 +1,132 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++26
+
+// template <class _Iterator, class _Container, class _ContainerMaxElements>
+// struct __capacity_aware_iterator;
+
+// Arithmetic operators
+
+#include <__iterator/capacity_aware_iterator.h>
+#include <cstddef>
+#include <iterator>
+
+#include "test_iterators.h"
+
+template <typename Iter>
+constexpr bool test() {
+  int arr[]           = {1, 2, 3, 4, 5, 6};
+  constexpr size_t sz = std::size(arr);
+
+  using CapIter = std::__capacity_aware_iterator<Iter, decltype(arr), sz>;
+
+  int* i = arr + 0;
+
+  // operator++()
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter& res = ++iter;
+
+    assert(&res == &iter);
+    assert(*iter == 2);
+  }
+
+  // operator++(int)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter res  = iter++;
+
+    assert(*res == 1);
+    assert(*iter == 2);
+  }
+
+  // operator--()
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 1));
+    CapIter& res = --iter;
+
+    assert(&iter == &res);
+    assert(*iter == 1);
+  }
+
+  // operator--(int)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 1));
+    CapIter res  = iter--;
+
+    assert(*res == 2);
+    assert(*iter == 1);
+  }
+
+  // operator+=(difference_type)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter& res = iter += 2;
+
+    assert(&iter == &res);
+    assert(*iter == 3);
+  }
+
+  // operator+(__capacity_aware_iterator, difference_type)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter res  = iter + 2;
+
+    assert(*iter == 1);
+    assert(*res == 3);
+  }
+
+  // operator+(difference_type, __capacity_aware_iterator)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter res  = 2 + iter;
+
+    assert(*iter == 1);
+    assert(*res == 3);
+  }
+
+  // operator-=(difference_type)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
+    CapIter& res = iter -= 2;
+
+    assert(&iter == &res);
+    assert(*iter == 1);
+  }
+
+  // operator-(__capacity_aware_iterator, difference_type)
+  {
+    CapIter iter = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
+    CapIter res  = iter - 2;
+
+    assert(*iter == 3);
+    assert(*res == 1);
+  }
+
+  // operator-(__capacity_aware_iterator, __capacity_aware_iterator)
+  {
+    CapIter iter        = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i));
+    CapIter iter2       = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 2));
+    CapIter iter3       = std::__make_capacity_aware_iterator<Iter, decltype(arr), sz>(Iter(i + 6));
+    std::ptrdiff_t res  = iter2 - iter;
+    std::ptrdiff_t res2 = iter3 - iter;
+
+    assert(res == 2);
+    assert(res2 == 6);
+  }
+
+  return true;
+}
+
+int main(int, char**) {
+  assert(test<cpp20_random_access_iterator<int*>>());
----------------
ldionne wrote:

Should we test random access and contiguous?

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


More information about the libcxx-commits mailing list