[libcxx-commits] [libcxx] [libc++] Add a compact, bounded iterator (PR #208271)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Thu Aug 27 01:24:00 PDT 2026


================
@@ -0,0 +1,268 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP__STATIC_PACKED_BOUNDED_ITER_H
+#define _LIBCPP__STATIC_PACKED_BOUNDED_ITER_H
+
+#include <__assert>
+#include <__bit/countr.h>
+#include <__compare/ordering.h>
+#include <__compare/three_way_comparable.h>
+#include <__config>
+#include <__cstddef/size_t.h>
+#include <__iterator/concepts.h>
+#include <__iterator/incrementable_traits.h>
+#include <__iterator/iterator_traits.h>
+#include <__type_traits/is_constructible.h>
+#include <__type_traits/is_pointer.h>
+
+#include <cstdint>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_PUSH_MACROS
+#include <__undef_macros>
+
+#if _LIBCPP_STD_VER >= 26
+
+// static_packed_bounded_iter is a bounded, contiguous iterator that is aware of its container's (compile-time) maximum
+// capacity. It packs the bottom bits of the base pointer with an offset that tracks the iterator's current position.
+// To retrieve the current pointer, we mask off the bottom bits to get the base pointer, and add its offset.
+// This only applies if the container's maximum range can fit inside the representable range of those bottom
+// bits, so (2 ^ available_bits) - 1
----------------
philnik777 wrote:

Have you considered incrementing the actual pointer as well? That would mean we only have to mask off the bits to get the actual pointer instead of masking (twice?), multiplying and adding. Incrementing the pointer should still be a simple add I think.

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


More information about the libcxx-commits mailing list