Sierra Toolkit Version of the Day
iterator_rdestl.h
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines