[libcxx-commits] [libcxx] [libc++] Simplify the implementation of string::{append, assign, assign_range} (PR #162254)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Thu Oct 9 18:26:54 PDT 2025


================
@@ -115,6 +115,44 @@ template <class It>
 cpp17_input_iterator(It) -> cpp17_input_iterator<It>;
 #endif
 
+template <class Container>
+class single_pass_iterator {
+  Container* container_;
+
+public:
+  using iterator_category = std::input_iterator_tag;
+  using value_type        = typename Container::value_type;
+  using difference_type   = typename Container::difference_type;
+  using pointer           = typename Container::pointer;
+  using reference         = typename Container::reference;
+
+  TEST_CONSTEXPR explicit single_pass_iterator() = default;
+  TEST_CONSTEXPR explicit single_pass_iterator(Container& container)
+      : container_(container.empty() ? nullptr : &container) {}
+
+  TEST_CONSTEXPR reference operator*() const { return container_->back(); }
+
+  TEST_CONSTEXPR_CXX14 single_pass_iterator& operator++() {
+    container_->pop_back();
+    if (container_->empty())
+      container_ = nullptr;
+    return *this;
+  }
+
+  TEST_CONSTEXPR_CXX14 single_pass_iterator operator++(int) { return ++(*this); }
+
+  friend TEST_CONSTEXPR bool operator==(const single_pass_iterator& lhs, const single_pass_iterator& rhs) {
+    return lhs.container_ == rhs.container_;
+  }
+
+  friend TEST_CONSTEXPR bool operator!=(const single_pass_iterator& lhs, const single_pass_iterator& rhs) {
+    return !(lhs == rhs);
+  }
+
+  template <class T>
+  void operator,(const T&) = delete;
----------------
frederick-vs-ja wrote:

For new testing iterators, I thing it's worthy adding (`T`, `Iter`) overload. See also #160732 and #161049.

```suggestion
  template <class T>
  void operator,(const T&) = delete;

  template <class T>
  friend void operator,(const T&, const single_pass_iterator&) = delete;
```

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


More information about the libcxx-commits mailing list