// // intrusive_iterator.hpp // intrusive_list // // Created by Sam Jaffe on 1/7/17. // #pragma once #include template class intrusive_list; template class intrusive_iterator : public std::iterator { public: typedef std::bidirectional_iterator_tag iterator_category; typedef typename N::value_type value_type; typedef typename N::reference reference; typedef typename N::const_reference const_reference; typedef typename N::pointer pointer; typedef typename N::const_pointer const_pointer; public: intrusive_iterator(N* node); operator const_intrusive_iterator() const; reference operator*(); const_reference operator*() const; pointer operator->(); const_pointer operator->() const; intrusive_iterator operator++(int); intrusive_iterator& operator++(); intrusive_iterator operator--(int); intrusive_iterator& operator--(); bool operator==(const intrusive_iterator& other) const; bool operator!=(const intrusive_iterator& other) const; private: friend intrusive_list; N* get() const; N* node_; }; template class const_intrusive_iterator : public std::iterator { public: typedef std::bidirectional_iterator_tag iterator_category; typedef typename N::value_type value_type; typedef typename N::reference reference; typedef typename N::const_reference const_reference; typedef typename N::pointer pointer; typedef typename N::const_pointer const_pointer; public: const_intrusive_iterator(N* node); const_reference operator*() const; const_pointer operator->() const; const_intrusive_iterator operator++(int); const_intrusive_iterator& operator++(); const_intrusive_iterator operator--(int); const_intrusive_iterator& operator--(); bool operator==(const const_intrusive_iterator& other) const; bool operator!=(const const_intrusive_iterator& other) const; private: friend intrusive_list; N* get() const; N* node_; };