Sierra Toolkit  Version of the Day
iterator_rdestl.h
1 #ifndef RDESTL_ITERATOR_H
2 #define RDESTL_ITERATOR_H
3 
4 #include <stk_util/util/rdestl_common.h>
5 
6 namespace rde
7 {
8 
9 //-----------------------------------------------------------------------------
10 struct input_iterator_tag {};
11 struct output_iterator_tag {};
12 struct forward_iterator_tag: public input_iterator_tag {};
13 struct bidirectional_iterator_tag: public forward_iterator_tag {};
14 struct random_access_iterator_tag: public bidirectional_iterator_tag {};
15 
16 //-----------------------------------------------------------------------------
17 template<typename IterT>
18 struct iterator_traits
19 {
20  typedef typename IterT::iterator_category iterator_category;
21 };
22 
23 template<typename T>
24 struct iterator_traits<T*>
25 {
26  typedef random_access_iterator_tag iterator_category;
27 };
28 
29 //-----------------------------------------------------------------------------
30 namespace internal
31 {
32  template<typename TIter, typename TDist> RDE_FORCEINLINE
33  void distance(TIter first, TIter last, TDist& dist, rde::random_access_iterator_tag)
34  {
35  dist = TDist(last - first);
36  }
37  template<typename TIter, typename TDist> RDE_FORCEINLINE
38  void distance(TIter first, TIter last, TDist& dist, rde::input_iterator_tag)
39  {
40  dist = 0;
41  while (first != last)
42  {
43  ++dist;
44  ++first;
45  }
46  }
47 
48  template<typename TIter, typename TDist> RDE_FORCEINLINE
49  void advance(TIter& iter, TDist d, rde::random_access_iterator_tag)
50  {
51  iter += d;
52  }
53  template<typename TIter, typename TDist> RDE_FORCEINLINE
54  void advance(TIter& iter, TDist d, rde::bidirectional_iterator_tag)
55  {
56  if (d >= 0)
57  {
58  while (d--)
59  ++iter;
60  }
61  else
62  {
63  while (d++)
64  --iter;
65  }
66  }
67  template<typename TIter, typename TDist> RDE_FORCEINLINE
68  void advance(TIter& iter, TDist d, rde::input_iterator_tag)
69  {
70  RDE_ASSERT(d >= 0);
71  while (d--)
72  ++iter;
73  }
74 } // namespace internal
75 } // namespace rde
76 
77 //-----------------------------------------------------------------------------
78 #endif // #ifndef RDESTL_ITERATOR_H