blob: 5ac7addfe771365abc5a1fb67cb9cce20f1d4a4c [file] [log] [blame]
#ifndef RDESTL_ITERATOR_H
#define RDESTL_ITERATOR_H
#include "rdestl_common.h"
namespace rde
{
//-----------------------------------------------------------------------------
struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag: public input_iterator_tag {};
struct bidirectional_iterator_tag: public forward_iterator_tag {};
struct random_access_iterator_tag: public bidirectional_iterator_tag {};
//-----------------------------------------------------------------------------
template<typename IterT>
struct iterator_traits
{
typedef typename IterT::iterator_category iterator_category;
};
template<typename T>
struct iterator_traits<T*>
{
typedef random_access_iterator_tag iterator_category;
};
//-----------------------------------------------------------------------------
namespace internal
{
template<typename TIter, typename TDist> RDE_FORCEINLINE
void distance(TIter first, TIter last, TDist& dist, rde::random_access_iterator_tag)
{
dist = TDist(last - first);
}
template<typename TIter, typename TDist> RDE_FORCEINLINE
void distance(TIter first, TIter last, TDist& dist, rde::input_iterator_tag)
{
dist = 0;
while (first != last)
{
++dist;
++first;
}
}
template<typename TIter, typename TDist> RDE_FORCEINLINE
void advance(TIter& iter, TDist d, rde::random_access_iterator_tag)
{
iter += d;
}
template<typename TIter, typename TDist> RDE_FORCEINLINE
void advance(TIter& iter, TDist d, rde::bidirectional_iterator_tag)
{
if (d >= 0)
{
while (d--)
++iter;
}
else
{
while (d++)
--iter;
}
}
template<typename TIter, typename TDist> RDE_FORCEINLINE
void advance(TIter& iter, TDist d, rde::input_iterator_tag)
{
RDE_ASSERT(d >= 0);
while (d--)
++iter;
}
} // namespace internal
} // namespace rde
//-----------------------------------------------------------------------------
#endif // #ifndef RDESTL_ITERATOR_H