[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