|
Sierra Toolkit
Version of the Day
|
00001 #ifndef RDESTL_ITERATOR_H 00002 #define RDESTL_ITERATOR_H 00003 00004 #include <stk_util/util/rdestl_common.h> 00005 00006 namespace rde 00007 { 00008 00009 //----------------------------------------------------------------------------- 00010 struct input_iterator_tag {}; 00011 struct output_iterator_tag {}; 00012 struct forward_iterator_tag: public input_iterator_tag {}; 00013 struct bidirectional_iterator_tag: public forward_iterator_tag {}; 00014 struct random_access_iterator_tag: public bidirectional_iterator_tag {}; 00015 00016 //----------------------------------------------------------------------------- 00017 template<typename IterT> 00018 struct iterator_traits 00019 { 00020 typedef typename IterT::iterator_category iterator_category; 00021 }; 00022 00023 template<typename T> 00024 struct iterator_traits<T*> 00025 { 00026 typedef random_access_iterator_tag iterator_category; 00027 }; 00028 00029 //----------------------------------------------------------------------------- 00030 namespace internal 00031 { 00032 template<typename TIter, typename TDist> RDE_FORCEINLINE 00033 void distance(TIter first, TIter last, TDist& dist, rde::random_access_iterator_tag) 00034 { 00035 dist = TDist(last - first); 00036 } 00037 template<typename TIter, typename TDist> RDE_FORCEINLINE 00038 void distance(TIter first, TIter last, TDist& dist, rde::input_iterator_tag) 00039 { 00040 dist = 0; 00041 while (first != last) 00042 { 00043 ++dist; 00044 ++first; 00045 } 00046 } 00047 00048 template<typename TIter, typename TDist> RDE_FORCEINLINE 00049 void advance(TIter& iter, TDist d, rde::random_access_iterator_tag) 00050 { 00051 iter += d; 00052 } 00053 template<typename TIter, typename TDist> RDE_FORCEINLINE 00054 void advance(TIter& iter, TDist d, rde::bidirectional_iterator_tag) 00055 { 00056 if (d >= 0) 00057 { 00058 while (d--) 00059 ++iter; 00060 } 00061 else 00062 { 00063 while (d++) 00064 --iter; 00065 } 00066 } 00067 template<typename TIter, typename TDist> RDE_FORCEINLINE 00068 void advance(TIter& iter, TDist d, rde::input_iterator_tag) 00069 { 00070 RDE_ASSERT(d >= 0); 00071 while (d--) 00072 ++iter; 00073 } 00074 } // namespace internal 00075 } // namespace rde 00076 00077 //----------------------------------------------------------------------------- 00078 #endif // #ifndef RDESTL_ITERATOR_H