// Safe sequence/iterator base implementation  -*- C++ -*-

// Copyright (C) 2003-2026 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file debug/safe_base.h
 *  This file is a GNU debug extension to the Standard C++ Library.
 */

#ifndef _GLIBCXX_DEBUG_SAFE_BASE_H
#define _GLIBCXX_DEBUG_SAFE_BASE_H 1

#include <ext/concurrence.h>

namespace __gnu_debug
{
  class _Safe_sequence_base;

  /** \brief Basic functionality for a @a safe iterator.
   *
   *  The %_Safe_iterator_base base class implements the functionality
   *  of a safe iterator that is not specific to a particular iterator
   *  type. It contains a pointer back to the sequence it references
   *  along with iterator version information and pointers to form a
   *  doubly-linked list of iterators referenced by the container.
   *
   *  This class must not perform any operations that can throw an
   *  exception, or the exception guarantees of derived iterators will
   *  be broken.
   */
  class _Safe_iterator_base
  {
    friend class _Safe_sequence_base;

  public:
    /** The sequence this iterator references; may be NULL to indicate
     *  a singular iterator. Stored as pointer-to-const because sequence
     *  could be declared as const.
     */
    const _Safe_sequence_base*	_M_sequence;

    /** The version number of this iterator. The sentinel value 0 is
     *  used to indicate an invalidated iterator (i.e., one that is
     *  singular because of an operation on the container). This
     *  version number must equal the version number in the sequence
     *  referenced by _M_sequence for the iterator to be
     *  non-singular.
     */
    unsigned int		_M_version;

    /** Pointer to the previous iterator in the sequence's list of
	iterators. Only valid when _M_sequence != NULL. */
    _Safe_iterator_base*	_M_prior;

    /** Pointer to the next iterator in the sequence's list of
	iterators. Only valid when _M_sequence != NULL. */
    _Safe_iterator_base*	_M_next;

  protected:
    /** Initializes the iterator and makes it singular. */
    _GLIBCXX20_CONSTEXPR
    _Safe_iterator_base()
    : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
    { }

    /** Initialize the iterator to reference the sequence pointed to
     *  by @p __seq. @p __constant is true when we are initializing a
     *  constant iterator, and false if it is a mutable iterator. Note
     *  that @p __seq may be NULL, in which case the iterator will be
     *  singular. Otherwise, the iterator will reference @p __seq and
     *  be nonsingular.
     */
    _GLIBCXX20_CONSTEXPR
    _Safe_iterator_base(const _Safe_sequence_base* __seq, bool __constant)
    : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
    {
      if (!std::__is_constant_evaluated())
	this->_M_attach(__seq, __constant);
    }

    /** Initializes the iterator to reference the same sequence that
	@p __x does. @p __constant is true if this is a constant
	iterator, and false if it is mutable. */
    _GLIBCXX20_CONSTEXPR
    _Safe_iterator_base(const _Safe_iterator_base& __x, bool __constant)
    : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
    {
      if (!std::__is_constant_evaluated())
	this->_M_attach(__x._M_sequence, __constant);
    }

    _GLIBCXX20_CONSTEXPR
    ~_Safe_iterator_base()
    {
      if (!std::__is_constant_evaluated())
	this->_M_detach();
    }

    /** For use in _Safe_iterator. */
    __gnu_cxx::__mutex&
    _M_get_mutex() _GLIBCXX_USE_NOEXCEPT;

    /** 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.
     */
    void
    _M_attach(const _Safe_sequence_base* __seq, bool __constant);

    /** Like _M_attach but not thread-safe. */
    void
    _M_attach_single(const _Safe_sequence_base* __seq,
		     bool __constant) _GLIBCXX_USE_NOEXCEPT;

    /** Detach the iterator from whatever sequence it is attached to,
     *	if any.
    */
    void
    _M_detach();

#if !_GLIBCXX_INLINE_VERSION
  private:
    /***************************************************************/
    /** Not-const method preserved for abi backward compatibility. */
    void
    _M_attach(_Safe_sequence_base* __seq, bool __constant);

    void
    _M_attach_single(_Safe_sequence_base* __seq,
		     bool __constant) _GLIBCXX_USE_NOEXCEPT;
    /***************************************************************/
#endif

  public:
    /** Like _M_detach but not thread-safe. */
    void
    _M_detach_single() _GLIBCXX_USE_NOEXCEPT;

    /** Determines if we are attached to the given sequence. */
    bool
    _M_attached_to(const _Safe_sequence_base* __seq) const
    { return _M_sequence == __seq; }

    /** Is this iterator singular? */
    _GLIBCXX_PURE bool
    _M_singular() const _GLIBCXX_USE_NOEXCEPT;

    /** Can we compare this iterator to the given iterator @p __x?
	Returns true if both iterators are nonsingular and reference
	the same sequence. */
    _GLIBCXX_PURE bool
    _M_can_compare(const _Safe_iterator_base& __x) const _GLIBCXX_USE_NOEXCEPT;

    /** Invalidate the iterator, making it singular. */
    void
    _M_invalidate()
    { _M_version = 0; }

    /** Reset all member variables */
    void
    _M_reset() _GLIBCXX_USE_NOEXCEPT;

    /** Unlink itself */
    void
    _M_unlink() _GLIBCXX_USE_NOEXCEPT
    {
      if (_M_prior)
	_M_prior->_M_next = _M_next;
      if (_M_next)
	_M_next->_M_prior = _M_prior;
    }
  };

  /** Iterators that derive from _Safe_iterator_base can be determined singular
   *  or non-singular.
   **/
  inline bool
  __check_singular_aux(const _Safe_iterator_base* __x)
  { return __x->_M_singular(); }

  /**
   * @brief Base class that supports tracking of iterators that
   * reference a sequence.
   *
   * The %_Safe_sequence_base class provides basic support for
   * tracking iterators into a sequence. Sequences that track
   * iterators must derived from %_Safe_sequence_base publicly, so
   * that safe iterators (which inherit _Safe_iterator_base) can
   * attach to them. This class contains two linked lists of
   * iterators, one for constant iterators and one for mutable
   * iterators, and a version number that allows very fast
   * invalidation of all iterators that reference the container.
   *
   * This class must ensure that no operation on it may throw an
   * exception, otherwise @a safe sequences may fail to provide the
   * exception-safety guarantees required by the C++ standard.
   */
  class _Safe_sequence_base
  {
    friend class _Safe_iterator_base;

  public:
    /// The list of mutable iterators that reference this container
    mutable _Safe_iterator_base* _M_iterators;

    /// The list of constant iterators that reference this container
    mutable _Safe_iterator_base* _M_const_iterators;

    /// The container version number. This number may never be 0.
    mutable unsigned int _M_version;

  protected:
    // Initialize with a version number of 1 and no iterators
    _GLIBCXX20_CONSTEXPR
    _Safe_sequence_base() _GLIBCXX_NOEXCEPT
    : _M_iterators(0), _M_const_iterators(0), _M_version(1)
    { }

#if __cplusplus >= 201103L
    _GLIBCXX20_CONSTEXPR
    _Safe_sequence_base(const _Safe_sequence_base&) noexcept
    : _Safe_sequence_base() { }

    // Move constructor swap iterators.
    _GLIBCXX20_CONSTEXPR
    _Safe_sequence_base(_Safe_sequence_base&& __seq) noexcept
    : _Safe_sequence_base()
    {
      if (!std::__is_constant_evaluated())
	_M_swap(__seq);
    }
#endif

    /** Notify all iterators that reference this sequence that the
	sequence is being destroyed. */
    _GLIBCXX20_CONSTEXPR
    ~_Safe_sequence_base() _GLIBCXX_NOEXCEPT
    {
      if (!std::__is_constant_evaluated())
	this->_M_detach_all();
    }

    // Copy assignment invalidate all iterators.
    _GLIBCXX20_CONSTEXPR _Safe_sequence_base&
    operator=(const _Safe_sequence_base&) _GLIBCXX_NOEXCEPT
    {
      _M_invalidate_all();
      return *this;
    }

#if __cplusplus >= 201103L
    _GLIBCXX20_CONSTEXPR _Safe_sequence_base&
    operator=(_Safe_sequence_base&& __x) noexcept
    {
      _M_invalidate_all();
      __x._M_invalidate_all();
      return *this;
    }
#endif

    /** Detach all iterators, leaving them singular. */
    void
    _M_detach_all() const;

    /** Detach all singular iterators.
     *  @post for all iterators i attached to this sequence,
     *   i->_M_version == _M_version.
     */
    void
    _M_detach_singular() const;

    /** Revalidates all attached singular iterators.  This method may
     *  be used to validate iterators that were invalidated before
     *  (but for some reason, such as an exception, need to become
     *  valid again).
     */
    void
    _M_revalidate_singular() const;

    /** Swap this sequence with the given sequence. This operation
     *  also swaps ownership of the iterators, so that when the
     *  operation is complete all iterators that originally referenced
     *  one container now reference the other container.
     */
    void
    _M_swap(const _Safe_sequence_base& __x) const _GLIBCXX_USE_NOEXCEPT;

    /** For use in _Safe_sequence. */
    __gnu_cxx::__mutex&
    _M_get_mutex() const _GLIBCXX_USE_NOEXCEPT;

    /** Invalidates all iterators. */
    _GLIBCXX20_CONSTEXPR void
    _M_invalidate_all() const
    { if (++_M_version == 0) _M_version = 1; }

  private:
#if !_GLIBCXX_INLINE_VERSION
    /***************************************************************/
    /** Not-const method preserved for abi backward compatibility. */
    void
    _M_detach_all();

    void
    _M_detach_singular();

    void
    _M_revalidate_singular();

    void
    _M_swap(_Safe_sequence_base& __x) _GLIBCXX_USE_NOEXCEPT;

    __gnu_cxx::__mutex&
    _M_get_mutex() _GLIBCXX_USE_NOEXCEPT;
    /***************************************************************/
#endif

    /** Attach an iterator to this sequence. */
    void
    _M_attach(_Safe_iterator_base* __it, bool __constant) const;

    /** Like _M_attach but not thread-safe. */
    void
    _M_attach_single(_Safe_iterator_base* __it,
		     bool __constant) const _GLIBCXX_USE_NOEXCEPT;

    /** Detach an iterator from this sequence */
    void
    _M_detach(_Safe_iterator_base* __it) const;

    /** Like _M_detach but not thread-safe. */
    void
    _M_detach_single(_Safe_iterator_base* __it) const _GLIBCXX_USE_NOEXCEPT;
  };
} // namespace __gnu_debug

#endif
