00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 00005 #ifndef BALL_CONCEPT_BASEITERATOR_H 00006 #define BALL_CONCEPT_BASEITERATOR_H 00007 00008 #ifndef BALL_CONFIG_CONFIG_H 00009 # include <BALL/CONFIG/config.h> 00010 #endif 00011 00012 #ifndef BALL_COMMON_GLOBAL_H 00013 # include <BALL/COMMON/global.h> 00014 #endif 00015 00016 #ifndef BALL_COMMON_EXCEPTION_H 00017 # include <BALL/COMMON/exception.h> 00018 #endif 00019 00020 namespace BALL 00021 { 00022 00063 template <typename Container, typename DataType, typename Position, typename Traits> 00064 class BaseIterator 00065 { 00066 public: 00067 00073 00074 typedef DataType value_type; 00076 typedef Position difference_type; 00078 typedef const DataType* pointer; 00080 typedef const DataType& reference; 00082 typedef std::input_iterator_tag iterator_category; 00084 00088 00089 BALL_INLINE BaseIterator() {} 00090 00092 BALL_INLINE BaseIterator(const BaseIterator& iterator) 00093 : traits_(iterator.traits_) 00094 { 00095 } 00096 00098 BALL_INLINE ~BaseIterator() {} 00100 00104 00109 BALL_INLINE BaseIterator& operator = (const BaseIterator& iterator) 00110 { 00111 traits_ = iterator.traits_; 00112 return *this; 00113 } 00114 00116 BALL_INLINE void swap(BaseIterator& iterator) { std::swap(traits_, iterator.traits_); } 00118 00122 00124 BALL_INLINE void invalidate() { traits_.invalidate(); } 00125 00127 BALL_INLINE void setTraits(const Traits& traits) { traits_ = traits; } 00128 00130 BALL_INLINE const Traits& getTraits() const { return traits_; } 00131 00133 BALL_INLINE Traits& getTraits() { return traits_; } 00134 00136 BALL_INLINE const Container* getContainer() const { return traits_.getContainer(); } 00138 00142 00147 BALL_INLINE operator const Position& () const { return traits_.getPosition(); } 00148 00150 BALL_INLINE reference operator * () const { return (reference)traits_.getData(); } 00151 00153 BALL_INLINE pointer operator -> () const { return (pointer)&traits_.getData(); } 00155 00159 00161 BALL_INLINE bool operator == (const BaseIterator& iterator) const { return (traits_ == iterator.traits_); } 00162 00164 BALL_INLINE bool operator != (const BaseIterator& iterator) const { return !(traits_ == iterator.traits_); } 00165 00170 BALL_INLINE bool isSingular() const { return traits_.isSingular(); } 00171 00175 BALL_INLINE bool isValid() const { return traits_.isValid(); } 00176 00178 BALL_INLINE bool operator + () const { return traits_.isValid(); } 00179 00181 BALL_INLINE bool operator - () const { return !traits_.isValid(); } 00183 00184 protected: 00185 00189 BALL_INLINE BaseIterator(const Container& container) 00190 : traits_(container) 00191 { 00192 } 00193 00194 private: 00195 00197 Traits traits_; 00198 }; 00199 00200 00201 } // namespace BALL 00202 00203 #endif // BALL_CONCEPT_BASEITERATOR_H