00001
00002
00003
00004
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 }
00204
00205 #endif // BALL_CONCEPT_BASEITERATOR_H