00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 // $Id: baseIterator.h,v 1.33 2003/08/26 08:04:06 oliver Exp $ 00005 // 00006 00007 #ifndef BALL_CONCEPT_BASEITERATOR_H 00008 #define BALL_CONCEPT_BASEITERATOR_H 00009 00010 #ifndef BALL_CONFIG_CONFIG_H 00011 # include <BALL/CONFIG/config.h> 00012 #endif 00013 00014 #ifndef BALL_COMMON_GLOBAL_H 00015 # include <BALL/COMMON/global.h> 00016 #endif 00017 00018 #ifndef BALL_COMMON_EXCEPTION_H 00019 # include <BALL/COMMON/exception.h> 00020 #endif 00021 00022 namespace BALL 00023 { 00024 00065 template <typename Container, typename DataType, typename Position, typename Traits> 00066 class BaseIterator 00067 { 00068 public: 00069 00075 00076 typedef DataType value_type; 00078 typedef Position difference_type; 00080 typedef const DataType* pointer; 00082 typedef const DataType& reference; 00084 typedef std::input_iterator_tag iterator_category; 00086 00090 00091 BALL_INLINE BaseIterator() {} 00092 00094 BALL_INLINE BaseIterator(const BaseIterator& iterator) 00095 : traits_(iterator.traits_) 00096 { 00097 } 00098 00100 BALL_INLINE ~BaseIterator() {} 00102 00106 00111 BALL_INLINE BaseIterator& operator = (const BaseIterator& iterator) 00112 { 00113 traits_ = iterator.traits_; 00114 return *this; 00115 } 00116 00118 BALL_INLINE void swap(BaseIterator& iterator) { std::swap(traits_, iterator.traits_); } 00120 00124 00126 BALL_INLINE void invalidate() { traits_.invalidate(); } 00127 00129 BALL_INLINE void setTraits(const Traits& traits) { traits_ = traits; } 00130 00132 BALL_INLINE const Traits& getTraits() const { return traits_; } 00133 00135 BALL_INLINE Traits& getTraits() { return traits_; } 00136 00138 BALL_INLINE const Container* getContainer() const { return traits_.getContainer(); } 00140 00144 00149 BALL_INLINE operator const Position& () const { return traits_.getPosition(); } 00150 00152 BALL_INLINE reference operator * () const { return (reference)traits_.getData(); } 00153 00155 BALL_INLINE pointer operator -> () const { return (pointer)&traits_.getData(); } 00157 00161 00163 BALL_INLINE bool operator == (const BaseIterator& iterator) const { return (traits_ == iterator.traits_); } 00164 00166 BALL_INLINE bool operator != (const BaseIterator& iterator) const { return !(traits_ == iterator.traits_); } 00167 00172 BALL_INLINE bool isSingular() const { return traits_.isSingular(); } 00173 00177 BALL_INLINE bool isValid() const { return traits_.isValid(); } 00178 00180 BALL_INLINE bool operator + () const { return traits_.isValid(); } 00181 00183 BALL_INLINE bool operator - () const { return !traits_.isValid(); } 00185 00186 protected: 00187 00191 BALL_INLINE BaseIterator(const Container& container) 00192 : traits_(container) 00193 { 00194 } 00195 00196 private: 00197 00199 Traits traits_; 00200 }; 00201 00202 00203 } // namespace BALL 00204 00205 #endif // BALL_CONCEPT_BASEITERATOR_H