intrusive_list.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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* pointer;
  24. typedef const T* const_pointer;
  25. typedef intrusive_iterator<node_type> iterator;
  26. typedef const_intrusive_iterator<node_type> const_iterator;
  27. typedef typename std::reverse_iterator<iterator> reverse_iterator;
  28. typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
  29. public:
  30. constexpr intrusive_list( node_type T::*node );
  31. intrusive_list( const intrusive_list& ) = delete;
  32. intrusive_list( intrusive_list&& other ) = default;
  33. intrusive_list( std::initializer_list<pointer> ilist, node_type T::*node );
  34. ~intrusive_list();
  35. intrusive_list& operator=( const intrusive_list& ) = delete;
  36. intrusive_list& operator=( intrusive_list&& other );
  37. intrusive_list& operator=( std::initializer_list<pointer> ilist );
  38. void assign( std::initializer_list<pointer> ilist );
  39. inline pointer front();
  40. inline const_pointer front() const;
  41. inline pointer back();
  42. inline const_pointer back() const;
  43. inline iterator begin() noexcept;
  44. inline const_iterator begin() const noexcept;
  45. inline const_iterator cbegin() const noexcept;
  46. inline iterator end() noexcept;
  47. inline const_iterator end() const noexcept;
  48. inline const_iterator cend() const noexcept;
  49. inline reverse_iterator rbegin();
  50. inline const_reverse_iterator rbegin() const noexcept;
  51. inline const_reverse_iterator crbegin() const noexcept;
  52. inline reverse_iterator rend() noexcept;
  53. inline const_reverse_iterator rend() const noexcept;
  54. inline const_reverse_iterator crend() const noexcept;
  55. inline bool empty() const noexcept;
  56. inline size_type size() const noexcept;
  57. inline size_type max_size() const noexcept;
  58. void clear() noexcept;
  59. iterator insert(const_iterator pos, pointer value);
  60. iterator transfer( const_iterator pos, pointer value );
  61. iterator insert(const_iterator pos, std::initializer_list<pointer> ilist);
  62. iterator erase(iterator pos);
  63. iterator erase(iterator first, iterator last);
  64. inline void push_back(pointer value);
  65. inline void pop_back();
  66. inline void push_front(pointer value);
  67. inline void pop_front();
  68. void remove( pointer value );
  69. template< class UnaryPredicate >
  70. void remove_if( UnaryPredicate pred );
  71. private:
  72. void insert_impl( const_iterator pos, node_type * n );
  73. inline void link(node_type* lhs, node_type* rhs);
  74. inline void unlink(node_type* node);
  75. node_type T::*node_;
  76. node_type end_{ nullptr }; // secretly const
  77. node_type *tail_{ &end_ };
  78. node_type *head_{ &end_ };
  79. size_type size_{ 0 };
  80. };
  81. #include "intrusive_iterator.tpp"
  82. #include "intrusive_node.tpp"
  83. #include "intrusive_list.tpp"