intrusive_list.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // intrusive_iterator.h
  3. // utilities
  4. //
  5. // Created by Sam Jaffe on 9/26/14.
  6. // Copyright (c) 2014 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <iterator>
  10. #include <limits>
  11. #include <cstddef>
  12. template <typename T> class intrusive_node;
  13. template <typename T> class intrusive_list;
  14. template <typename T> class intrusive_iterator;
  15. template <typename T> class const_intrusive_iterator;
  16. template <typename T>
  17. class intrusive_list {
  18. public:
  19. typedef T value_type;
  20. typedef intrusive_node<value_type> node_type;
  21. typedef std::size_t size_type;
  22. typedef std::ptrdiff_t difference_type;
  23. typedef T& reference;
  24. typedef T const& const_reference;
  25. typedef T* pointer;
  26. typedef const T* const_pointer;
  27. typedef intrusive_iterator<node_type> iterator;
  28. typedef const_intrusive_iterator<node_type> const_iterator;
  29. typedef typename std::reverse_iterator<iterator> reverse_iterator;
  30. typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
  31. public:
  32. constexpr intrusive_list( node_type T::*node );
  33. intrusive_list( const intrusive_list& ) = delete;
  34. intrusive_list( intrusive_list&& other ) = default;
  35. intrusive_list( std::initializer_list<pointer> ilist, node_type T::*node );
  36. ~intrusive_list();
  37. intrusive_list& operator=( const intrusive_list& ) = delete;
  38. intrusive_list& operator=( intrusive_list&& other );
  39. intrusive_list& operator=( std::initializer_list<pointer> ilist );
  40. void assign( std::initializer_list<pointer> ilist );
  41. inline reference front();
  42. inline const_reference front() const;
  43. inline reference back();
  44. inline const_reference back() const;
  45. inline iterator begin() noexcept;
  46. inline const_iterator begin() const noexcept;
  47. inline const_iterator cbegin() const noexcept;
  48. inline iterator end() noexcept;
  49. inline const_iterator end() const noexcept;
  50. inline const_iterator cend() const noexcept;
  51. inline reverse_iterator rbegin();
  52. inline const_reverse_iterator rbegin() const noexcept;
  53. inline const_reverse_iterator crbegin() const noexcept;
  54. inline reverse_iterator rend() noexcept;
  55. inline const_reverse_iterator rend() const noexcept;
  56. inline const_reverse_iterator crend() const noexcept;
  57. inline bool empty() const noexcept;
  58. inline size_type size() const noexcept;
  59. inline size_type max_size() const noexcept;
  60. void clear() noexcept;
  61. iterator insert(const_iterator pos, pointer value);
  62. iterator transfer( const_iterator pos, pointer value );
  63. iterator insert(const_iterator pos, std::initializer_list<pointer> ilist);
  64. iterator erase(iterator pos);
  65. iterator erase(iterator first, iterator last);
  66. inline void push_back(pointer value);
  67. inline void pop_back();
  68. inline void push_front(pointer value);
  69. inline void pop_front();
  70. void remove( pointer value );
  71. template< class UnaryPredicate >
  72. void remove_if( UnaryPredicate pred );
  73. private:
  74. void insert_impl( const_iterator pos, node_type * n );
  75. inline void link(node_type* lhs, node_type* rhs);
  76. inline void unlink(node_type* node);
  77. node_type T::*node_;
  78. node_type end_{ nullptr }; // secretly const
  79. node_type *tail_{ &end_ };
  80. node_type *head_{ &end_ };
  81. size_type size_{ 0 };
  82. };
  83. #include "intrusive_iterator.tpp"
  84. #include "intrusive_node.tpp"
  85. #include "intrusive_list.tpp"