__GNU_DEBUG::_SAFE_ITERATOR(3)

πŸ’– NAME πŸ’–

__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category > β€” Safe iterator wrapper. πŸ’…

okay so real talk, bestie: this page comes from the Library Functions Manual, section 3 β€” that's the library-calls corner of the man pages, iykyk. And it's a class template, not some lil function, so there is a LOT going on. Grab a snack. πŸ“


✨ SYNOPSIS ✨

#include <safe_iterator.h>

Inherits β€” the original literally just says "Inherits ." with nothing after the dot. Not me pointing that out, that's just what it says. πŸ™ˆ

Inherited by __gnu_debug::_Safe_iterator< _Iterator, _Sequence, std::random_access_iterator_tag >.

πŸ¦‹ Public Types πŸ¦‹

  • typedef _Safe_iterator< _Iterator, _Sequence, iterator_category > _Self β€” the class pointing at its own type, main character energy honestly. πŸ‘‘
  • typedef _Traits::difference_type difference_type β€” borrowing difference_type from _Traits.
  • typedef _Traits::iterator_category iterator_category β€” and the iterator_category too.
  • using iterator_concept β€” a using for iterator_concept.
  • typedef _Iterator iterator_type β€” the underlying iterator type, the one this whole thing is wrapping.
  • typedef _Traits::pointer pointer β€” pointer, straight from _Traits.
  • typedef _Traits::reference reference β€” reference, also from _Traits.
  • typedef _Traits::value_type value_type β€” and value_type. the whole _Traits family reunion. πŸ’–

🌸 Public Member Functions 🌸

  • constexpr _Safe_iterator () noexcept β€” the plain default constructor, doing default-constructor things.
  • constexpr _Safe_iterator (_Iterator __i, const _Safe_sequence_base *__seq) noexcept β€” Safe iterator construction from an unsafe iterator and its sequence. ✨
  • constexpr _Safe_iterator (_Safe_iterator &&__x) noexcept β€” Move construction. πŸ¦‹
  • constexpr _Safe_iterator (const _Safe_iterator &__x) noexcept β€” Copy construction. πŸŽ€
  • template<typename _MutableIterator> constexpr _Safe_iterator (const _Safe_iterator< _MutableIterator, _Sequence, typename __gnu_cxx::__enable_if< _IsConstant::__value &&std::__are_same< _MutableIterator, _OtherIterator >::__value, _Category >::__type > &__x) noexcept β€” Converting constructor from a mutable iterator to a constant iterator. the glow-up from mutable to const, slay. πŸ’…
  • void _M_attach (const _Safe_sequence_base *__seq) β€” attach, but the internal one.
  • void _M_attach_single (const _Safe_sequence_base *__seq) β€” attach, singular edition.
  • bool _M_attached_to (const _Safe_sequence_base *__seq) const β€” are we attached to __seq? inquiring minds.
  • bool _M_before_dereferenceable () const β€” Is the iterator before a dereferenceable one?
  • template<typename _Diff> bool _M_can_advance (const std::pair< _Diff, _Distance_precision > &__dist, int __way) const β€” the templated "can you advance" check.
  • bool _M_can_advance (difference_type __n, bool __strict=false) const β€” the non-template "can you advance" check, and yes __strict defaults to false.
  • bool _M_can_compare (const _Safe_iterator_base &__x) const noexcept β€” "can you compare", noexcept.
  • bool _M_dereferenceable () const β€” Is the iterator dereferenceable? the vibe check before you * it. πŸ”₯
  • void _M_detach_single () noexcept β€” detach, singular edition.
  • _Distance_traits< _Iterator >::__type _M_get_distance_from_begin () const β€” distance from the beginning.
  • _Distance_traits< _Iterator >::__type _M_get_distance_to (const _Safe_iterator &__rhs) const β€” distance to __rhs.
  • _Distance_traits< _Iterator >::__type _M_get_distance_to_end () const β€” distance to the end.
  • __gnu_cxx::__conditional_type< _IsConstant::__value, const_Sequence *, _Sequence * >::__type _M_get_sequence () const β€” hands you back the sequence, and whether it's const depends on _IsConstant::__value.
  • bool _M_incrementable () const β€” Is the iterator incrementable?
  • void _M_invalidate () β€” make it invalid.
  • bool _M_is_before_begin () const β€” Is this iterator equal to the sequence's before_begin() iterator if any?
  • constexpr bool _M_is_begin () const β€” Is this iterator equal to the sequence's begin() iterator?
  • bool _M_is_beginnest () const β€” Is this iterator equal to the sequence's before_begin() iterator if any or begin() otherwise? "beginnest" is such a word and I'm obsessed. 😭
  • bool _M_is_end () const β€” Is this iterator equal to the sequence's end() iterator?
  • void _M_reset () noexcept β€” reset it.
  • bool _M_singular () const noexcept β€” is it singular?
  • void _M_unlink () noexcept β€” unlink it.
  • bool _M_valid_range (const _Safe_iterator &__rhs, std::pair< difference_type, _Distance_precision > &__dist, bool __check_dereferenceable=true) const β€” the valid-range check, with __check_dereferenceable defaulting to true.
  • bool _M_value_initialized () const β€” Is the iterator value-initialized?
  • constexpr const _Iterator & base () const noexcept β€” the const flavour of base().
  • constexpr _Iterator & base () noexcept β€” Return the underlying iterator.
  • constexpr operator _Iterator () const noexcept β€” Conversion to underlying non-debug iterator to allow better interaction with non-debug containers.
  • constexpr reference operator* () const noexcept β€” Iterator dereference.
  • constexpr _Safe_iterator & operator++ () noexcept β€” Iterator preincrement.
  • constexpr _Safe_iterator operator++ (int) noexcept β€” Iterator postincrement.
  • constexpr pointer operator-> () const noexcept β€” Iterator dereference. again, but through the arrow this time.
  • constexpr _Safe_iterator & operator= (_Safe_iterator &&__x) noexcept β€” Move assignment.
  • constexpr _Safe_iterator & operator= (const _Safe_iterator &__x) noexcept β€” Copy assignment.

⭐ Static Public Member Functions ⭐

  • static constexpr bool _S_constant () β€” Determine if this is a constant iterator.

πŸŽ€ Public Attributes πŸŽ€

  • _Safe_iterator_base * _M_next
  • _Safe_iterator_base * _M_prior
  • const _Safe_sequence_base * _M_sequence
  • unsigned int _M_version

πŸ’œ Protected Types πŸ’œ

  • typedef std::__are_same< typename _Sequence::_Base::const_iterator, _Iterator > _IsConstant
  • typedef __gnu_cxx::__conditional_type< _IsConstant::__value, typename_Sequence::_Base::iterator, typename_Sequence::_Base::const_iterator >::__type _OtherIterator

🧚 Protected Member Functions 🧚

  • constexpr _Safe_iterator (const _Safe_iterator &__x, _Unchecked) noexcept
  • void _M_attach (const _Safe_sequence_base *__seq, bool __constant)
  • void _M_attach_single (const _Safe_sequence_base *__seq, bool __constant) noexcept
  • void _M_detach ()
  • __gnu_cxx::__mutex & _M_get_mutex () noexcept

🌈 Friends 🌈

  • template<typename _IteR> constexpr friend bool operator== (const _Self &__lhs, const _Safe_iterator< _IteR, _Sequence, iterator_category > &__rhs) noexcept
  • constexpr friend bool operator== (const _Self &__lhs, const _Self &__rhs) noexcept

πŸ’« Detailed Description πŸ’«

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
class __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >

Safe iterator wrapper.

okay so here's the whole concept, bestie. The class template _Safe_iterator is a wrapper around an iterator that keeps track of where that iterator is moving around among sequences, and it checks that whatever you're doing to the "safe" iterator is actually legal. On top of the basic iterator operations (which get validated, and then passed to the underlying iterator), _Safe_iterator has member functions for iterator invalidation, for attaching/detaching the iterator from sequences, and for querying the iterator's state. so it's like a bodyguard for your iterator, fr fr. 🫢

⚠️ Note that _Iterator must be the first base class so that it gets initialized before the iterator is being attached to the container's list of iterators and it is being detached before _Iterator get destroyed. Otherwise it would result in a data race. no cap, that's a real one. πŸ’€

πŸ”₯ Constructor & Destructor Documentation πŸ”₯

_Safe_iterator ()

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_Safe_iterator () [inline],  [constexpr],  [noexcept]

Postcondition

  • the iterator is singular and unattached

_Safe_iterator (_Iterator __i, const _Safe_sequence_base * __seq)

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_Safe_iterator (_Iterator __i, const _Safe_sequence_base * __seq)
[inline],  [constexpr],  [noexcept]

Safe iterator construction from an unsafe iterator and its sequence.

Precondition

  • seq is not NULL

Postcondition

  • this is not singular

_Safe_iterator (const _Safe_iterator< _Iterator, _Sequence, _Category > & __x)

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_Safe_iterator (const _Safe_iterator< _Iterator, _Sequence, _Category
> & __x) [inline],  [constexpr],  [noexcept]

Copy construction.


_Safe_iterator (_Safe_iterator< _Iterator, _Sequence, _Category > && __x)

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_Safe_iterator (_Safe_iterator< _Iterator, _Sequence, _Category > &&
__x) [inline],  [constexpr],  [noexcept]

Move construction.

Postcondition

  • __x is singular and unattached

_Safe_iterator (const _Safe_iterator< _MutableIterator, _Sequence, ... > & __x)

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category>
template<typename _MutableIterator> __gnu_debug::_Safe_iterator<
_Iterator, _Sequence, _Category >::_Safe_iterator (const _Safe_iterator<
_MutableIterator, _Sequence, typename __gnu_cxx::__enable_if<
_IsConstant::__value &&std::__are_same< _MutableIterator, _OtherIterator
>::__value, _Category >::__type > & __x) [inline],  [constexpr],
[noexcept]

Converting constructor from a mutable iterator to a constant iterator.


🌟 Member Function Documentation 🌟

_M_attach

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category> void
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_M_attach (const _Safe_sequence_base * __seq) [inline]

Attach iterator to the given sequence.

Referenced by __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator(), __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator(), __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator(), __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=(), and __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=().


_Safe_iterator_base::_M_attach

void __gnu_debug::_Safe_iterator_base::_M_attach (const _Safe_sequence_base
    * __seq, bool __constant) [protected],  [inherited]

Attaches this iterator to the given sequence, detaching it from whatever sequence it was attached to originally. If the new sequence is the NULL pointer, the iterator is left unattached.

References _M_attach().

Referenced by _Safe_iterator_base(), _Safe_iterator_base(), __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_attach(), and _M_attach().


_M_attach_single

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category> void
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_M_attach_single (const _Safe_sequence_base * __seq) [inline]

Likewise, but not thread-safe.


_Safe_iterator_base::_M_attach_single

void __gnu_debug::_Safe_iterator_base::_M_attach_single (const
    _Safe_sequence_base * __seq, bool __constant) [protected],  [noexcept],
    [inherited]

Likewise, but not thread-safe.

References _M_attach_single().

Referenced by __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_attach_single(), and _M_attach_single().


_Safe_iterator_base::_M_attached_to

bool __gnu_debug::_Safe_iterator_base::_M_attached_to (const
    _Safe_sequence_base * __seq) const [inline],  [inherited]

Determines if we are attached to the given sequence.

References _M_attached_to(), and _M_sequence.

Referenced by _M_attached_to().


_M_before_dereferenceable

template<typename _Iterator, typename _Sequence, typename _Category =
    typename std::iterator_traits<_Iterator>::iterator_category> bool
__gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category
>::_M_before_dereferenceable () const [inline]

Is the iterator before a dereferenceable one?

_M_can_compare πŸ’…

bool __gnu_debug::_Safe_iterator_base::_M_can_compare (const _Safe_iterator_base & __x) const [noexcept], [inherited]

okay so bestie, this one is literally asking: can we even compare this iterator to the one you passed in, __x? It returns true only if both iterators are nonsingular and reference the same sequence. No cap.

  • References: _Safe_iterator_base(), and _M_can_compare().
  • Referenced by: _M_can_compare().

_M_dereferenceable ✨

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_dereferenceable () const [inline]

Is the iterator dereferenceable? Like, can you actually do *it without it being a whole mess? That's the question. πŸ’–

  • Referenced by: __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator*(), and __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator->().

_M_detach πŸŽ€

void __gnu_debug::_Safe_iterator_base::_M_detach () [protected], [inherited]

Detach the iterator from whatever sequence it's attached to, if any. Like, it's breaking up with the container. πŸ’”

  • References: _M_detach().
  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • _M_detach()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()

_M_detach_single πŸ¦‹

void __gnu_debug::_Safe_iterator_base::_M_detach_single () [noexcept], [inherited]

Likewise, but not thread-safe. So like, same energy but don't try this in a multithreaded situation, bestie. πŸ™ˆ


_M_get_mutex πŸ”’

__gnu_cxx::__mutex & __gnu_debug::_Safe_iterator_base::_M_get_mutex () [protected], [noexcept], [inherited]

For use in _Safe_iterator. It's giving "I'm the lock, you need me for thread safety." πŸ‘‘

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator++()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::operator++()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::operator=()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::operator=()

_M_incrementable πŸš€

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_incrementable () const [inline]

Is the iterator incrementable? Like, can you do ++it without the universe exploding? That's the vibe check. πŸ’₯

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_before_dereferenceable()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator++()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator++()

_M_invalidate πŸ’€

void __gnu_debug::_Safe_iterator_base::_M_invalidate () [inline], [inherited]

Invalidate the iterator, making it singular. So it's like, poof, you're nothing now. No cap. 😭

  • References: _M_invalidate(), and _M_version.
  • Referenced by: _M_invalidate().

_M_is_before_begin 🌸

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_is_before_begin () const [inline]

Is this iterator equal to the sequence's before_begin() iterator if any? So like, are you the "before the beginning" vibe? πŸ€”

  • Referenced by: __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_dereferenceable().

_M_is_begin ⭐

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_is_begin () const [inline], [constexpr]

Is this iterator equal to the sequence's begin() iterator? Like, are you the first? The main character? πŸ‘‘


_M_is_beginnest 🧚

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_is_beginnest () const [inline]

Is this iterator equal to the sequence's before_begin() iterator if any or begin() otherwise? So like, the "beginning-est" you can be? That's a vibe. ✨


_M_is_end πŸ”š

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_is_end () const [inline]

Is this iterator equal to the sequence's end() iterator? Like, are you at the end? The final boss? 🏁

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_dereferenceable()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_incrementable()

_M_reset πŸ”„

void __gnu_debug::_Safe_iterator_base::_M_reset () [noexcept], [inherited]

Reset all member variables. Like a factory reset but for your iterator. πŸ’…


_M_singular πŸ«₯

bool __gnu_debug::_Safe_iterator_base::_M_singular () const [noexcept], [inherited]

Is this iterator singular? Like, is it all alone, not attached to any sequence? That's the question. 😢

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::_Safe_local_iterator()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::_Safe_local_iterator()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::_Safe_local_iterator()
    • __gnu_debug::__check_singular_aux()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_dereferenceable()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::_M_dereferenceable()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_incrementable()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::_M_incrementable()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::operator=()
    • __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer >::operator=()

void __gnu_debug::_Safe_iterator_base::_M_unlink () [inline], [noexcept], [inherited]

Unlink itself. Like, removing yourself from the group chat. πŸ‘‹

  • References: _M_next, _M_prior, and _M_unlink().
  • Referenced by: _M_unlink().

_M_value_initialized 🍼

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_M_value_initialized () const [inline]

Is the iterator value-initialized? Like, is it a fresh baby iterator? πŸ‘Ά

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()

_S_constant 🧊

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> constexpr bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::_S_constant () [inline], [static], [constexpr]

Determine if this is a constant iterator. Like, is it unchangeable? Frozen? ❄️

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_attach()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_attach_single()

base 🎁

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> _Iterator & __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::base () [inline], [constexpr], [noexcept]

Return the underlying iterator. Like, unwrapping the gift to see the real iterator inside. πŸŽ€

  • Referenced by:
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_Safe_iterator()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_before_dereferenceable()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_is_begin()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_is_end()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::_M_value_initialized()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator*()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator++()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator->()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()
    • __gnu_debug::_Safe_iterator< _Base_iterator, map >::operator=()

operator _Iterator πŸ”„

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator _Iterator () const [inline], [constexpr], [noexcept]

Conversion to underlying non-debug iterator to allow better interaction with non-debug containers. So like, you can vibe with the normal iterators too. 🀝


operator* πŸ’–

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator* () const [inline], [nodiscard], [constexpr], [noexcept]

Iterator dereference. Like, getting the actual value. ✨

Precondition: iterator is dereferenceable


operator++ (pre) πŸš€

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> _Safe_iterator & __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator++ () [inline], [constexpr], [noexcept]

Iterator preincrement. Like, moving forward. πŸ’«

Precondition: iterator is incrementable


operator++ (post) πŸƒβ€β™€οΈ

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> _Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator++ (int ) [inline], [constexpr], [noexcept]

Iterator postincrement. Like, moving forward but returning the old vibe. ✨

Precondition: iterator is incrementable


operator-> πŸ‘‰

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> pointer __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator-> () const [inline], [nodiscard], [constexpr], [noexcept]

Iterator dereference. Like, getting the pointer to the value. 🎯

Precondition: iterator is dereferenceable


operator= (move) 🚚

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> _Safe_iterator & __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator= (_Safe_iterator< _Iterator, _Sequence, _Category > && __x) [inline], [constexpr], [noexcept]

Move assignment. Like, taking everything from __x and leaving it empty. πŸ’¨

Postcondition: __x is singular and unattached


operator= (copy) πŸ“‹

template<typename _Iterator, typename _Sequence, typename _Category = typename std::iterator_traits<_Iterator>::iterator_category> _Safe_iterator & __gnu_debug::_Safe_iterator< _Iterator, _Sequence, _Category >::operator= (const _Safe_iterator< _Iterator, _Sequence, _Category > & __x) [inline], [constexpr], [noexcept]

Copy assignment. Like, making a copy of __x into this. πŸ“

✨ Member Data Documentation ✨

  • _Safe_iterator_base* __gnu_debug::_Safe_iterator_base::_M_next [inherited] This is a pointer to the next iterator in the sequence's list of iterators. It's only valid when _M_sequence != NULL. So if _M_sequence is NULL, don't even look at it, bestie. πŸ’€
     Referenced by _Safe_iterator_base(), _Safe_iterator_base(),
     _Safe_iterator_base(), __gnu_debug::_Safe_sequence< _Sequence
     >::_M_transfer_from_if(), and _M_unlink().
  • _Safe_iterator_base* __gnu_debug::_Safe_iterator_base::_M_prior [inherited] This is a pointer to the previous iterator in the sequence's list of iterators. It's only valid when _M_sequence != NULL. Same energy as _M_next but backwards. πŸ”™
     Referenced by _Safe_iterator_base(), _Safe_iterator_base(),
     _Safe_iterator_base(), __gnu_debug::_Safe_sequence< _Sequence
     >::_M_transfer_from_if(), and _M_unlink().
  • const _Safe_sequence_base* __gnu_debug::_Safe_iterator_base::_M_sequence [inherited] This is the sequence that the iterator references. It may be NULL to indicate a singular iterator. It's stored as pointer-to-const because the sequence could be declared as const. So it's giving const-correctness realness. ✨
     Referenced by __gnu_debug::_Safe_iterator< _Base_iterator, map
     >::_Safe_iterator(), __gnu_debug::_Safe_iterator< _Base_iterator, map
     >::_Safe_iterator(), __gnu_debug::_Safe_iterator< _Base_iterator, map
     >::_Safe_iterator(), _Safe_iterator_base(), _Safe_iterator_base(),
     _Safe_iterator_base(), _M_attached_to(), __gnu_debug::_Safe_sequence<
     _Sequence >::_M_transfer_from_if(), __gnu_debug::_Safe_iterator<
     _Base_iterator, map >::operator=(), __gnu_debug::_Safe_iterator<
     _Base_iterator, map >::operator=(), __gnu_debug::_Safe_local_iterator<
     _OtherIterator, _UContainer >::operator=(), and
     __gnu_debug::_Safe_local_iterator< _OtherIterator, _UContainer
     >::operator=().
  • unsigned int __gnu_debug::_Safe_iterator_base::_M_version [inherited] This is the version number of the iterator. The sentinel value 0 means the iterator is invalidated (i.e., it's singular because of an operation on the container). For the iterator to be non-singular, this version number must equal the version number in the sequence referenced by _M_sequence. So it's a whole vibe check. πŸ’…
     Referenced by _Safe_iterator_base(), _Safe_iterator_base(),
     _Safe_iterator_base(), _M_invalidate(), and __gnu_debug::_Safe_sequence<
     _Sequence >::_M_transfer_from_if().

πŸ‘‘ Author πŸ‘‘

This page was auto-generated by Doxygen for libstdc++ straight from the source code. No human wrote this by hand, bestie. It's giving robot magic. ✨


And that's a wrap on this page, bestie! This gem comes from libstdc++, and its title is __gnu_debu...Category >(3). The footer didn't show a date, but honestly, it's timeless. Stay iconic, and may your iterators always be safe. πŸ’–βœ¨

πŸ“¦ where this page comes from
  • arch rolling: gcc 16.2.1+r23+gd564253eb6c8-1 Β· GPL-3.0-or-later WITH GCC-exception-3.1 AND GFDL-1.3-or-later
  • fedora 44: libstdc++-docs 16.0.1-0.10.fc44 Β· GPL-3.0-or-later AND LGPL-3.0-or-later AND (GPL-3.0-or-later WITH GCC-exception-3.1) AND (GPL-3.0-or-later WITH Texinfo-exception) AND (LGPL-2.1-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GNU-compiler-exception) AND BSL-1.0 AND GFDL-1.3-or-later AND Linux-man-pages-copyleft-2-para AND SunPro AND BSD-1-Clause AND BSD-2-Clause AND BSD-2-Clause-Views AND BSD-3-Clause AND BSD-4-Clause AND BSD-Source-Code AND Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 WITH LLVM-Exception) AND ZPL-2.1 AND ISC AND LicenseRef-Fedora-Public-Domain AND HP-1986 AND curl AND Martin-Birgmeier AND HPND-Markus-Kuhn AND dtoa AND SMLNJ AND AMD-newlib AND OAR AND HPND-merchantability-variant AND HPND-Intel
  • fedora 44: libstdc++-docs 16.2.1-2.fc44
  • fedora 44: libstdc++-docs 16.2.1-3.fc44 Β· GPL-3.0-or-later AND LGPL-3.0-or-later AND (GPL-3.0-or-later WITH GCC-exception-3.1) AND (GPL-3.0-or-later WITH Texinfo-exception) AND (LGPL-2.1-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GNU-compiler-exception) AND BSL-1.0 AND GFDL-1.3-or-later AND Linux-man-pages-copyleft-2-para AND SunPro AND BSD-1-Clause AND BSD-2-Clause AND BSD-2-Clause-Views AND BSD-3-Clause AND BSD-4-Clause AND BSD-Source-Code AND Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 WITH LLVM-Exception) AND ZPL-2.1 AND ISC AND LicenseRef-Fedora-Public-Domain AND HP-1986 AND curl AND Martin-Birgmeier AND HPND-Markus-Kuhn AND dtoa AND SMLNJ AND AMD-newlib AND OAR AND HPND-merchantability-variant AND HPND-Intel
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms