intrusive_iterator.hpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. operator const_intrusive_iterator<N>() const;
  22. reference operator*();
  23. const_reference operator*() const;
  24. pointer operator->();
  25. const_pointer operator->() const;
  26. intrusive_iterator operator++(int);
  27. intrusive_iterator& operator++();
  28. intrusive_iterator operator--(int);
  29. intrusive_iterator& operator--();
  30. bool operator==(const intrusive_iterator& other) const;
  31. bool operator!=(const intrusive_iterator& other) const;
  32. private:
  33. friend intrusive_list<value_type>;
  34. N* get() const;
  35. N* node_;
  36. };
  37. template <typename N>
  38. class const_intrusive_iterator : public std::iterator<std::bidirectional_iterator_tag, typename N::value_type> {
  39. public:
  40. typedef std::bidirectional_iterator_tag iterator_category;
  41. typedef typename N::value_type value_type;
  42. typedef typename N::reference reference;
  43. typedef typename N::const_reference const_reference;
  44. typedef typename N::pointer pointer;
  45. typedef typename N::const_pointer const_pointer;
  46. public:
  47. const_intrusive_iterator(N* node);
  48. const_reference operator*() const;
  49. const_pointer operator->() const;
  50. const_intrusive_iterator operator++(int);
  51. const_intrusive_iterator& operator++();
  52. const_intrusive_iterator operator--(int);
  53. const_intrusive_iterator& operator--();
  54. bool operator==(const const_intrusive_iterator& other) const;
  55. bool operator!=(const const_intrusive_iterator& other) const;
  56. private:
  57. friend intrusive_list<value_type>;
  58. N* get() const;
  59. N* node_;
  60. };