00001 // -*- C++ -*- 00002 00008 #if !defined(__ads_circulator_h__) 00009 #define __ads_circulator_h__ 00010 00011 #include "../defs.h" 00012 00013 #include <iterator> 00014 00015 BEGIN_NAMESPACE_ADS 00016 00018 00023 template <class Iterator> 00024 class Face_Halfedge_circ 00025 { 00026 private: 00027 00028 typedef std::iterator_traits<Iterator> traits; 00029 00030 public: 00031 00033 typedef typename traits::value_type value_type; 00035 typedef typename traits::difference_type difference_type; 00037 typedef typename traits::reference reference; 00039 typedef typename traits::pointer pointer; 00040 00041 // I'm leaving the category blank for now. 00042 00043 private: 00044 00045 // 00046 // Member data. 00047 // 00048 00049 Iterator _i; 00050 00051 public: 00052 00053 // 00054 // Constructors 00055 // 00056 00058 Face_Halfedge_circ() : 00059 _i() 00060 {} 00061 00063 explicit 00064 Face_Halfedge_circ( Iterator i ) : 00065 _i( i ) 00066 {} 00067 00069 template <class Iterator2> 00070 Face_Halfedge_circ( const Face_Halfedge_circ<Iterator2>& c ) : 00071 _i( c.base() ) 00072 {} 00073 00074 // 00075 // Dereferencing. 00076 // 00077 00079 reference 00080 operator*() const 00081 { 00082 return *_i; 00083 } 00084 00086 pointer 00087 operator->() const 00088 { 00089 return _i; 00090 } 00091 00092 // 00093 // Increment 00094 // 00095 00097 Face_Halfedge_circ& 00098 operator++() 00099 { 00100 _i = _i->next(); 00101 return *this; 00102 } 00103 00105 Face_Halfedge_circ 00106 operator++( int ) 00107 { 00108 Face_Halfedge_circ tmp = *this; 00109 ++*this; 00110 return tmp; 00111 } 00112 00113 // 00114 // Decrement 00115 // 00116 00118 Face_Halfedge_circ& 00119 operator--() 00120 { 00121 _i = _i->prev(); 00122 return *this; 00123 } 00124 00126 Face_Halfedge_circ 00127 operator--(int) 00128 { 00129 Face_Halfedge_circ tmp = *this; 00130 --*this; 00131 return tmp; 00132 } 00133 00134 // 00135 // Base iterator. 00136 // 00137 00139 const Iterator& 00140 base() const 00141 { 00142 return _i; 00143 } 00144 00145 }; 00146 00147 // 00148 // Equality 00149 // 00150 00152 template <class Iterator> 00153 inline 00154 bool 00155 operator==( const Face_Halfedge_circ<Iterator>& x, 00156 const Face_Halfedge_circ<Iterator>& y ) 00157 { 00158 return x.base() == y.base(); 00159 } 00160 00162 template <class Iterator> 00163 inline 00164 bool 00165 operator!=( const Face_Halfedge_circ<Iterator>& x, 00166 const Face_Halfedge_circ<Iterator>& y ) 00167 { 00168 return !( x == y ); 00169 } 00170 00171 END_NAMESPACE_ADS 00172 00173 #endif