StrideIterator.h 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef STRIDE_ITERATOR_H_
  2. #define STRIDE_ITERATOR_H_
  3. #include <iterator>
  4. template<class T>
  5. class StrideIterator : public std::iterator<std::random_access_iterator_tag, T>
  6. {
  7. public:
  8. //@TODO: Get rid of all stl usage and remove this crap.
  9. typedef std::iterator<std::random_access_iterator_tag, T> base_iterator;
  10. typedef typename base_iterator::value_type value_type;
  11. typedef typename base_iterator::difference_type difference_type;
  12. typedef typename base_iterator::pointer pointer;
  13. typedef typename base_iterator::reference reference;
  14. typedef typename base_iterator::iterator_category iterator_category;
  15. StrideIterator () : m_Pointer(NULL), m_Stride(1) {}
  16. StrideIterator (void* p, int stride) : m_Pointer (reinterpret_cast<UInt8*> (p)), m_Stride (stride) {}
  17. StrideIterator (StrideIterator const& arg) : m_Pointer(arg.m_Pointer), m_Stride(arg.m_Stride) {}
  18. void operator = (StrideIterator const& arg) { m_Pointer = arg.m_Pointer; m_Stride = arg.m_Stride; }
  19. bool operator == (StrideIterator const& arg) const { return m_Pointer == arg.m_Pointer; }
  20. bool operator != (StrideIterator const& arg) const { return m_Pointer != arg.m_Pointer; }
  21. bool operator < (StrideIterator const& arg) const { return m_Pointer < arg.m_Pointer; }
  22. void operator++() { m_Pointer += m_Stride; }
  23. void operator++(int) { m_Pointer += m_Stride; }
  24. StrideIterator operator + (difference_type n) const { return StrideIterator (m_Pointer + m_Stride * n, m_Stride); }
  25. void operator += (difference_type n) { m_Pointer += m_Stride * n; }
  26. difference_type operator-(StrideIterator const& it) const
  27. {
  28. Assert (m_Stride == it.m_Stride && "Iterators stride must be equal");
  29. Assert (m_Stride != 0 && "Stide must not be zero");
  30. return ((uintptr_t)m_Pointer - (uintptr_t)it.m_Pointer) / m_Stride;
  31. }
  32. T& operator[](size_t index) { return *reinterpret_cast<T*> (m_Pointer + m_Stride * index); }
  33. const T& operator[](size_t index) const { return *reinterpret_cast<const T*> (m_Pointer + m_Stride * index); }
  34. T& operator*() { return *reinterpret_cast<T*> (m_Pointer); }
  35. const T& operator*() const { return *reinterpret_cast<const T*> (m_Pointer); }
  36. T* operator->() { return reinterpret_cast<T*> (m_Pointer); }
  37. const T* operator->() const { return reinterpret_cast<const T*> (m_Pointer); }
  38. // Iterator is NULL if not valid
  39. bool IsNull () const { return m_Pointer == 0; }
  40. void* GetPointer() const { return m_Pointer; }
  41. int GetStride() const { return m_Stride; }
  42. private:
  43. UInt8* m_Pointer;
  44. int m_Stride;
  45. };
  46. template<class T>
  47. void strided_copy (const T* src, const T* srcEnd, StrideIterator<T> dst)
  48. {
  49. for (; src != srcEnd ; src++, ++dst)
  50. *dst = *src;
  51. }
  52. template<class T>
  53. void strided_copy (StrideIterator<T> src, StrideIterator<T> srcEnd, StrideIterator<T> dst)
  54. {
  55. for (; src != srcEnd ; ++src, ++dst)
  56. *dst = *src;
  57. }
  58. template<class T>
  59. void strided_copy (StrideIterator<T> src, StrideIterator<T> srcEnd, T* dst)
  60. {
  61. for (; src != srcEnd ; ++src, ++dst)
  62. *dst = *src;
  63. }
  64. template<class T, class T2>
  65. void strided_copy_convert (const T* src, const T* srcEnd, StrideIterator<T2> dst)
  66. {
  67. for (; src != srcEnd ; ++src, ++dst)
  68. *dst = *src;
  69. }
  70. #endif // STRIDE_ITERATOR_H_