#pragma once #include #include enum class iterator_type_t{ contiguous_iterator, non_contiguous_iterator, lazy_iterator }; template struct pointer_iterator final { T* data; typedef T value_type; typedef std::size_t difference_type; static constexpr iterator_type_t iterator_type = iterator_type_t::contiguous_iterator; constexpr pointer_iterator(const pointer_iterator& oth) : data{oth.data} {} constexpr pointer_iterator(T* ptr) : data{ptr} {} constexpr operator T&() { return *data; } constexpr T& operator*(){ return *data; } constexpr pointer_iterator operator++() { return pointer_iterator{++data}; } constexpr pointer_iterator operator++(int) { return pointer_iterator{data++}; } constexpr pointer_iterator operator--() { return pointer_iterator{--data}; } constexpr pointer_iterator operator--(int) { return pointer_iterator{data--}; } constexpr pointer_iterator operator+(const std::size_t offset) { return pointer_iterator{data+offset}; } constexpr pointer_iterator operator+(const int offset) { return pointer_iterator{data+offset}; } constexpr pointer_iterator operator-(const std::size_t offset) { return pointer_iterator{data-offset}; } constexpr pointer_iterator operator-(const int offset) { return pointer_iterator{data-offset}; } constexpr difference_type operator-(const pointer_iterator& oth) const { return (T*)data-(T*)oth.data; } constexpr bool operator==(const pointer_iterator& oth) { return data==oth.data; } constexpr bool operator!=(pointer_iterator& oth) { return data!=oth.data; } constexpr bool before_or_equal(const pointer_iterator& oth) { return reinterpret_cast(data) <= reinterpret_cast(oth.data); } constexpr bool operator<=(const pointer_iterator& oth) { return before_or_equal(oth); } };