// file : cutl/container/pointer-iterator.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file #ifndef CUTL_CONTAINER_POINTER_ITERATOR_HXX #define CUTL_CONTAINER_POINTER_ITERATOR_HXX #include // std::iterator_traits #include namespace cutl { namespace container { template class pointer_iterator { public: typedef typename meta::remove_p::value_type>::r value_type; typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::difference_type difference_type; typedef value_type& reference; typedef value_type* pointer; typedef I base_iterator; public: pointer_iterator () : i_ () // I can be of a pointer type. { } pointer_iterator (I const& i) : i_ (i) { } public: reference operator* () const { return **i_; } pointer operator-> () const { return *i_; } I const& base () const { return i_; } public: // Forward iterator requirements. // pointer_iterator& operator++ () { ++i_; return *this; } pointer_iterator operator++ (int) { pointer_iterator r (*this); ++i_; return r; } pointer_iterator& operator-- () { --i_; return *this; } pointer_iterator operator-- (int) { pointer_iterator r (*this); --i_; return r; } private: I i_; }; template inline bool operator== (pointer_iterator const& a, pointer_iterator const& b) { return a.base () == b.base (); } template inline bool operator!= (pointer_iterator const& a, pointer_iterator const& b) { return a.base () != b.base (); } template inline typename pointer_iterator::difference_type operator- (pointer_iterator const& a, pointer_iterator const& b) { return a.base () - b.base (); } } } #endif // CUTL_CONTAINER_POINTER_ITERATOR_HXX