00001 #ifndef BALL_LINALG_BASEITERATOR_H 00002 #define BALL_LINALG_BASEITERATOR_H 00003 00004 namespace BALL 00005 { 00006 00016 template <typename Container, typename DataType, typename Position, typename Traits> 00017 class BaseIterator 00018 { 00019 public: 00020 00026 00027 typedef DataType value_type; 00029 typedef Position difference_type; 00031 typedef const DataType* pointer; 00033 typedef const DataType& reference; 00035 typedef Container container_type; 00037 typedef Traits traits_type; 00039 typedef std::input_iterator_tag iterator_category; 00041 00045 00046 BaseIterator() {} 00047 00049 BaseIterator(const BaseIterator& iterator) 00050 : traits_(iterator.traits_) 00051 { 00052 } 00053 00055 ~BaseIterator() {} 00057 00061 00066 BaseIterator& operator = (const BaseIterator& iterator) 00067 { 00068 traits_ = iterator.traits_; 00069 return *this; 00070 } 00071 00073 void swap(BaseIterator& iterator) { std::swap(traits_, iterator.traits_); } 00075 00079 00081 void invalidate() { traits_.invalidate(); } 00082 00084 void setTraits(const Traits& traits) { traits_ = traits; } 00085 00087 const Traits& getTraits() const { return traits_; } 00088 00090 Traits& getTraits() { return traits_; } 00091 00093 const Container* getContainer() const { return traits_.getContainer(); } 00095 00099 00104 operator const Position& () const { return traits_.getPosition(); } 00105 00107 reference operator * () const { return (reference)traits_.getData(); } 00108 00110 pointer operator -> () const { return (pointer)&traits_.getData(); } 00112 00116 00118 bool operator == (const BaseIterator& iterator) const { return (traits_ == iterator.traits_); } 00119 00121 bool operator != (const BaseIterator& iterator) const { return !(traits_ == iterator.traits_); } 00122 00127 bool isSingular() const { return traits_.isSingular(); } 00128 00132 bool isValid() const { return traits_.isValid(); } 00133 00135 bool operator + () const { return traits_.isValid(); } 00136 00138 bool operator - () const { return !traits_.isValid(); } 00140 00141 protected: 00142 00146 BaseIterator(const Container& container) 00147 : traits_(container) 00148 { 00149 } 00150 00151 private: 00152 00154 Traits traits_; 00155 }; 00156 00157 00158 } // namespace BALL 00159 00160 #endif // BALL_KERNEL_BASEITERATOR_H