/* A "next" iterator for GDB, the GNU debugger.
   Copyright (C) 2019-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef COMMON_NEXT_ITERATOR_H
#define COMMON_NEXT_ITERATOR_H

#include "gdbsupport/iterator-range.h"

/* An iterator that uses the 'next' field of a type to iterate.  This
   can be used with various GDB types that are stored as linked
   lists.  */

template<typename T>
struct next_iterator
{
  typedef next_iterator self_type;
  typedef T *value_type;
  typedef T *&reference;
  typedef T **pointer;
  typedef std::forward_iterator_tag iterator_category;
  typedef int difference_type;

  explicit next_iterator (T *item)
    : m_item (item)
  {
  }

  /* Create a one-past-the-end iterator.  */
  next_iterator ()
    : m_item (nullptr)
  {
  }

  value_type operator* () const
  {
    return m_item;
  }

  bool operator== (const self_type &other) const
  {
    return m_item == other.m_item;
  }

  bool operator!= (const self_type &other) const
  {
    return m_item != other.m_item;
  }

  self_type &operator++ ()
  {
    m_item = m_item->next;
    return *this;
  }

private:

  T *m_item;
};

/* A convenience wrapper to make a range type around a next_iterator.  */

template <typename T>
using next_range = iterator_range<next_iterator<T>>;

#endif /* COMMON_NEXT_ITERATOR_H */
