ThePEG  1.8.0
DIterator.h
1 // -*- C++ -*-
2 //
3 // DIterator.h is a part of ThePEG - Toolkit for HEP Event Generation
4 // Copyright (C) 1999-2011 Leif Lonnblad
5 //
6 // ThePEG is licenced under version 2 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef ThePEG_DIterator_H
10 #define ThePEG_DIterator_H
11 // This is the declaration of the DIterator class.
12 
13 #include <iterator>
14 
15 namespace ThePEG {
16 
17 template <typename BaseIterator>
29 class DIterator {
30 
31 public:
32 
34  typedef std::iterator_traits<BaseIterator> Traits;
36  typedef typename Traits::iterator_category iterator_category;
38  typedef typename Traits::difference_type difference_type;
40  typedef typename Traits::value_type PtrType;
42  typedef std::iterator_traits<PtrType> PtrTraits;
44  typedef typename PtrTraits::value_type value_type;
46  typedef typename PtrTraits::pointer pointer;
48  typedef typename PtrTraits::reference reference;
49 
50 public:
51 
55  DIterator(const BaseIterator & in): i(in) {}
56 
60  DIterator(const DIterator & pi): i(pi.i) {}
61 
62 public:
63 
67  reference operator*() const { return **i; }
68 
72  pointer operator->() const { return *i; }
73 
77  DIterator & operator=(const DIterator & pi) { i = pi.i; return *this; }
78 
82  DIterator & operator=(const BaseIterator & pi) { i = pi; return *this; }
83 
87  DIterator & operator++() { ++i; return *this; }
89  DIterator operator++(int) { DIterator tmp(*this); ++i; return tmp; }
91  DIterator & operator--() { --i; return *this; }
93  DIterator operator--(int) { DIterator tmp(*this); --i; return tmp; }
95  DIterator & operator+=(int n) { i += n; return *this; }
97  DIterator operator+(int n) { return DIterator(i + n); }
99  DIterator & operator-=(int n) { i -= n; return *this; }
101  DIterator operator-(int n) { return DIterator(i - n); }
103 
108  reference operator[](difference_type n) { return *(i[n]); }
109 
113  difference_type operator-(const DIterator & pi) { return i - pi.i; }
114 
118  bool operator==(const DIterator & pi) { return i == pi.i; }
120  bool operator!=(const DIterator & pi) { return i != pi.i; }
122  bool operator<(const DIterator & pi) { return i < pi.i; }
124  bool operator>(const DIterator & pi) { return i > pi.i; }
126  bool operator<=(const DIterator & pi) { return i <= pi.i; }
128  bool operator>=(const DIterator & pi) { return i >= pi.i; }
130  bool operator==(const BaseIterator & bi) { return i == bi; }
132  bool operator!=(const BaseIterator & bi) { return i != bi; }
134  bool operator<(const BaseIterator & bi) { return i < bi; }
136  bool operator>(const BaseIterator & bi) { return i > bi; }
138  bool operator<=(const BaseIterator & bi) { return i <= bi; }
140  bool operator>=(const BaseIterator & bi) { return i >= bi; }
142 
143 private:
144 
148  BaseIterator i;
149 
150 private:
151 
156 
157 };
158 
159 }
160 
161 #endif /* ThePEG_DIterator_H */