Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<class T>
- class EnumIterator
- {
- private:
- T value;
- typedef typename std::underlying_type<T>::type under;
- public:
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
- typedef T value_type;
- typedef T reference;
- typedef T* pointer;
- typedef std::random_access_iterator_tag iterator_category;
- constexpr EnumIterator() :value() {}
- constexpr EnumIterator(const EnumIterator& rhs) noexcept(true) :value(rhs.value) {}
- constexpr explicit EnumIterator(T value_) noexcept(true) :value(value_) {}
- ~EnumIterator() noexcept(true) {}
- EnumIterator& operator=(const EnumIterator& rhs) noexcept(true) {value=rhs.valud; return *this;}
- EnumIterator& operator++() noexcept(true) {value = (T)(under(value) + 1); return *this;}
- EnumIterator operator++(int) noexcept(true) {EnumIterator r(*this); ++*this; return r;}
- EnumIterator& operator+=(size_type o) noexcept(true) {value = (T)(under(value) + o); return *this;}
- friend constexpr EnumIterator operator+(const EnumIterator& it, size_type o) noexcept(true) {return EnumIterator((T)(under(it)+o));}
- friend constexpr EnumIterator operator+(size_type o, const EnumIterator& it) noexcept(true) {return EnumIterator((T)(under(it)+o));}
- EnumIterator& operator--() noexcept(true) {value = (T)(under(value) - 1); return *this;}
- EnumIterator operator--(int) noexcept(true) {EnumIterator r(*this); --*this; return r;}
- EnumIterator& operator-=(size_type o) noexcept(true) {value = (T)(under(value) + o); return *this;}
- friend constexpr EnumIterator operator-(const EnumIterator& it, size_type o) noexcept(true) {return EnumIterator((T)(under(it)-o));}
- friend constexpr difference_type operator-(EnumIterator lhs, EnumIterator rhs) noexcept(true) {return under(lhs.value)-under(rhs.value);}
- constexpr reference operator*() const noexcept(true) {return value;}
- constexpr reference operator[](size_type o) const noexcept(true) {return (T)(under(value) + o);}
- constexpr const T* operator->() const noexcept(true) {return &value;}
- constexpr friend bool operator==(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value==rhs.value;}
- constexpr friend bool operator!=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value!=rhs.value;}
- constexpr friend bool operator<(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value<rhs.value;}
- constexpr friend bool operator>(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value>rhs.value;}
- constexpr friend bool operator<=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value<=rhs.value;}
- constexpr friend bool operator>=(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {return lhs.value>=rhs.value;}
- friend void swap(const EnumIterator& lhs, const EnumIterator& rhs) noexcept(true) {std::swap(lhs.value, rhs.value);}
- };
- template<typename T>
- constexpr EnumIterator<T> begin(T)
- {
- return EnumIterator<T>(T::First);
- }
- template<typename T>
- constexpr EnumIterator<T> end(T)
- {
- return EnumIterator<T>(T::Last);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement