intrusive_iterator.hpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // intrusive_iterator.hpp
  3. // intrusive_list
  4. //
  5. // Created by Sam Jaffe on 1/7/17.
  6. //
  7. #pragma once
  8. #include <iterator>
  9. template <typename T> class intrusive_list;
  10. template <typename N>
  11. class intrusive_iterator : public std::iterator<std::bidirectional_iterator_tag, typename N::value_type> {
  12. public:
  13. typedef std::bidirectional_iterator_tag iterator_category;
  14. typedef typename N::value_type value_type;
  15. typedef typename N::reference reference;
  16. typedef typename N::const_reference const_reference;
  17. typedef typename N::pointer pointer;
  18. typedef typename N::const_pointer const_pointer;
  19. public:
  20. intrusive_iterator(N* node);
  21. reference operator*();
  22. const_reference operator*() const;
  23. pointer operator->();
  24. const_pointer operator->() const;
  25. intrusive_iterator operator++(int);
  26. intrusive_iterator& operator++();
  27. intrusive_iterator operator--(int);
  28. intrusive_iterator& operator--();
  29. bool operator==(const intrusive_iterator& other) const;
  30. bool operator!=(const intrusive_iterator& other) const;
  31. private:
  32. friend intrusive_list<value_type>;
  33. N* get() const;
  34. N* node_;
  35. };
  36. template <typename N>
  37. class const_intrusive_iterator : public std::iterator<std::bidirectional_iterator_tag, typename N::value_type> {
  38. public:
  39. typedef std::bidirectional_iterator_tag iterator_category;
  40. typedef typename N::value_type value_type;
  41. typedef typename N::reference reference;
  42. typedef typename N::const_reference const_reference;
  43. typedef typename N::pointer pointer;
  44. typedef typename N::const_pointer const_pointer;
  45. public:
  46. const_intrusive_iterator(N* node);
  47. const_reference operator*() const;
  48. const_pointer operator->() const;
  49. const_intrusive_iterator operator++(int);
  50. const_intrusive_iterator& operator++();
  51. const_intrusive_iterator operator--(int);
  52. const_intrusive_iterator& operator--();
  53. bool operator==(const const_intrusive_iterator& other) const;
  54. bool operator!=(const const_intrusive_iterator& other) const;
  55. private:
  56. friend intrusive_list<value_type>;
  57. N* get() const;
  58. N* node_;
  59. };