00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00036 #ifndef _depends_details_iterator_h
00037 #define _depends_details_iterator_h
00038
00039 #include <iterator>
00040 #include "Node.h"
00041
00042 namespace Depends
00043 {
00044 namespace Details
00045 {
00047 struct reverse_tag {};
00048
00050 template <class ValueType, typename ReferenceType, typename PointerType, typename ScoreType, typename IteratorType>
00051 struct IteratorBase : public std::iterator<std::forward_iterator_tag, ValueType, ptrdiff_t, PointerType, ReferenceType>
00052 {
00053 typedef IteratorBase<ValueType, ValueType&, ValueType*, ScoreType, IteratorType> iterator;
00054 typedef IteratorBase<ValueType, const ValueType&, const ValueType*, ScoreType, IteratorType> const_iterator;
00055 typedef Node<ValueType, ScoreType> node_type;
00056
00057 IteratorBase(const IteratorType & i) : iter_(i) {}
00058 IteratorBase(const iterator & i) : iter_(i.iter_) {}
00059
00060 ReferenceType operator*() const { return (*iter_)->value_; }
00061 PointerType operator->() const { return &((*iter_)->value_); }
00062
00063 bool operator==(const IteratorBase & i) const { return iter_ == i.iter_; }
00064 bool operator!=(const IteratorBase & i) const { return iter_ != i.iter_; }
00065
00066 const node_type * node() const { return *iter_; }
00067 node_type * node() { return *iter_; }
00068
00069 IteratorType iter_;
00070 };
00071
00073 template <class ValueType, typename ReferenceType, typename PointerType, typename ScoreType, typename IteratorType>
00074 struct Iterator : public IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>
00075 {
00076 typedef Iterator<ValueType, ValueType&, ValueType*, ScoreType, IteratorType> iterator;
00077 typedef Iterator<ValueType, const ValueType&, const ValueType*, ScoreType, IteratorType> const_iterator;
00078 typedef IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType> super;
00079
00080 Iterator(const IteratorType & i) : IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>(i) {}
00081 Iterator(const iterator & i) : IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>(i) {}
00082
00083 Iterator & operator++() { ++(super::iter_); return *this; };
00084 Iterator operator++(int) { Iterator tmp = *this; ++(super::iter_); return tmp; };
00085
00086 Iterator & operator--() { --(super::iter_); return *this; };
00087 Iterator operator--(int) { Iterator tmp = *this; --(super::iter_); return tmp; };
00088 };
00089
00091 template <class ValueType, typename ReferenceType, typename PointerType, typename ScoreType, typename IteratorType>
00092 struct ReverseIterator : public IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>
00093 {
00094 typedef ReverseIterator<ValueType, ValueType&, ValueType*, ScoreType, IteratorType> iterator;
00095 typedef ReverseIterator<ValueType, const ValueType&, const ValueType*, ScoreType, IteratorType> const_iterator;
00096 typedef IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType> super;
00097
00098 ReverseIterator(const IteratorType & i) : IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>(i) {}
00099 ReverseIterator(const iterator & i) : IteratorBase<ValueType, ReferenceType, PointerType, ScoreType, IteratorType>(i) {}
00100
00101 ReverseIterator & operator++() { ++(super::iter_); return *this; };
00102 ReverseIterator operator++(int) { ReverseIterator tmp = *this; ++(super::iter_); return tmp; };
00103
00104 ReverseIterator & operator--() { --(super::iter_); return *this; };
00105 ReverseIterator operator--(int) { ReverseIterator tmp = *this; --(super::iter_); return tmp; };
00106 };
00107 }
00108 }
00109
00110 #endif
00111