Advertisement
Guest User

Untitled

a guest
Mar 28th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. template<class T>
  2. class EnumIterator
  3. {
  4. private:
  5. T value;
  6. typedef typename std::underlying_type<T>::type under;
  7. public:
  8. typedef std::size_t size_type;
  9. typedef std::ptrdiff_t difference_type;
  10. typedef T value_type;
  11. typedef T reference;
  12. typedef T* pointer;
  13. typedef std::random_access_iterator_tag iterator_category;
  14.  
  15. constexpr EnumIterator() :value() {}
  16. constexpr EnumIterator(const EnumIterator& rhs) noexcept(true) :value(rhs.value) {}
  17. constexpr explicit EnumIterator(T value_) noexcept(true) :value(value_) {}
  18. ~EnumIterator() noexcept(true) {}
  19. EnumIterator& operator=(const EnumIterator& rhs) noexcept(true) {value=rhs.valud; return *this;}
  20. EnumIterator& operator++() noexcept(true) {value = (T)(under(value) + 1); return *this;}
  21. EnumIterator operator++(int) noexcept(true) {EnumIterator r(*this); ++*this; return r;}
  22. EnumIterator& operator+=(size_type o) noexcept(true) {value = (T)(under(value) + o); return *this;}
  23. friend constexpr EnumIterator operator+(const EnumIterator& it, size_type o) noexcept(true) {return EnumIterator((T)(under(it)+o));}
  24. friend constexpr EnumIterator operator+(size_type o, const EnumIterator& it) noexcept(true) {return EnumIterator((T)(under(it)+o));}
  25. EnumIterator& operator--() noexcept(true) {value = (T)(under(value) - 1); return *this;}
  26. EnumIterator operator--(int) noexcept(true) {EnumIterator r(*this); --*this; return r;}
  27. EnumIterator& operator-=(size_type o) noexcept(true) {value = (T)(under(value) + o); return *this;}
  28. friend constexpr EnumIterator operator-(const EnumIterator& it, size_type o) noexcept(true) {return EnumIterator((T)(under(it)-o));}
  29. friend constexpr difference_type operator-(EnumIterator lhs, EnumIterator rhs) noexcept(true) {return under(lhs.value)-under(rhs.value);}
  30. constexpr reference operator*() const noexcept(true) {return value;}
  31. constexpr reference operator[](size_type o) const noexcept(true) {return (T)(under(value) + o);}
  32. constexpr const T* operator->() const noexcept(true) {return &value;}
  33. constexpr friend bool operator==(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value==rhs.value;}
  34. constexpr friend bool operator!=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value!=rhs.value;}
  35. constexpr friend bool operator<(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value<rhs.value;}
  36. constexpr friend bool operator>(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value>rhs.value;}
  37. constexpr friend bool operator<=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value<=rhs.value;}
  38. constexpr friend bool operator>=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value>=rhs.value;}
  39. friend void swap(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {std::swap(lhs.value, rhs.value);}
  40. };
  41.  
  42. template<typename T>
  43. constexpr EnumIterator<T> begin(T)
  44. {
  45. return EnumIterator<T>(T::First);
  46. }
  47.  
  48. template<typename T>
  49. constexpr EnumIterator<T> end(T)
  50. {
  51. return EnumIterator<T>(T::Last);
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement