BALL
1.4.1
|
00001 #ifndef BALL_LINALG_BASEFILTERITERATOR_H 00002 #define BALL_LINALG_BASEFILTERITERATOR_H 00003 00004 namespace BALL 00005 { 00006 00016 template <class Predicate, class IteratorBase > 00017 class BaseFilterIterator 00018 { 00019 00020 public: 00021 00023 Predicate predicate_; 00024 IteratorBase iterator_; 00025 00027 typedef typename IteratorBase::container_type Container; 00029 typedef typename IteratorBase::value_type DataType; 00031 typedef typename IteratorBase::difference_type Position; 00033 typedef typename IteratorBase::traits_type Traits; 00035 typedef typename IteratorBase::value_type value_type; 00037 typedef typename IteratorBase::difference_type difference_type; 00039 typedef typename IteratorBase::pointer pointer; 00041 typedef typename IteratorBase::reference reference; 00043 typedef std::input_iterator_tag iterator_category; 00044 00050 00051 00055 00056 BaseFilterIterator() {} 00058 BaseFilterIterator(Predicate p, IteratorBase it) 00059 : predicate_(p), iterator_(it) 00060 { 00061 } 00062 00064 BaseFilterIterator(const BaseFilterIterator& iterator) 00065 : predicate_(iterator.predicate_), iterator_(iterator.iterator_) 00066 { 00067 } 00068 00070 ~BaseFilterIterator() {} 00072 00076 00081 BaseFilterIterator& operator = (const BaseFilterIterator& iterator) 00082 { 00083 predicate_ = iterator.predicate_; 00084 iterator_ = iterator.iterator_; 00085 return *this; 00086 } 00087 00089 void swap(BaseFilterIterator& iterator) 00090 { 00091 std::swap(predicate_, iterator.predicate_); 00092 std::swap(iterator_, iterator.iterator_); 00093 } 00095 00099 00101 void invalidate() { iterator_.invalidate(); } 00102 00104 void setTraits(const Traits& traits) { iterator_.setTraits(traits); } 00105 00107 const Traits& getTraits() const { return iterator_.getTraits(); } 00108 00110 Traits& getTraits() { return iterator_.getTraits(); } 00111 00113 void setPredicate(const Predicate& predicate) { predicate_ = predicate; } 00114 00116 const Predicate& getPredicate() const { return predicate_; } 00117 00119 Predicate& getPredicate() { return predicate_; } 00120 00122 const Container* getContainer() const { return iterator_.getContainer(); } 00124 00128 00133 operator const Position& () const { return iterator_(); } 00134 00136 reference operator * () const { return *iterator_; } 00137 00139 pointer operator -> () const { return iterator_.operator->(); } 00141 00145 00147 bool operator == (const BaseFilterIterator& iterator) const { return (iterator_ == iterator.iterator_); } 00148 00150 bool operator != (const BaseFilterIterator& iterator) const { return !(iterator_ == iterator.iterator_); } 00151 00153 bool operator == (const IteratorBase& iterator) const { return (iterator_ == iterator); } 00154 00156 bool operator != (const IteratorBase& iterator) const { return !(iterator_ == iterator); } 00157 00162 bool isSingular() const { return iterator_.isSingular(); } 00163 00167 bool isValid() const { return iterator_.isValid(); } 00168 00170 bool operator + () const { return +(iterator_); } 00171 00173 bool operator - () const { return -(iterator_); } 00175 00176 protected: 00177 00181 BaseFilterIterator(const Container& container) 00182 : iterator_(container) 00183 { 00184 } 00185 }; 00186 00187 00188 } // namespace BALL 00189 00190 #endif // BALL_KERNEL_BASEFILTERITERATOR_H