#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include template class IteratorWrapper : public std::iterator::iterator_category, typename std::iterator_traits::value_type> { private: using type = IteratorWrapper; public: using iterator_category = typename std::iterator_traits::iterator_category; using value_type = typename std::iterator_traits::value_type; using difference_type = typename std::iterator_traits::difference_type; using reference = typename std::iterator_traits::reference; using pointer = typename std::iterator_traits::pointer; public: IteratorWrapper(W Iterator) : Iterator(Iterator) {} type &operator++() { ++Iterator; return *this; } type &operator--() { --Iterator; return *this; } type operator++(int) { return type(Iterator++); } type operator--(int) { return type(Iterator--); } type operator+(const difference_type &n) const { return type(Iterator + n); } type &operator+=(difference_type n) { Iterator += n; return *this; } type operator-(const difference_type &n) const { return type(Iterator - n); } type &operator-=(const difference_type &n) { Iterator -= n; return *this; } reference operator*() const { return *Iterator; } pointer operator->() const { return Iterator.operator->(); } reference operator[](const difference_type &n) const { return Iterator[n]; } bool operator==(const type &r2) const { return Iterator == r2.Iterator; } bool operator!=(const type &r2) { return Iterator != r2.Iterator; } bool operator<(const type &r2) { return Iterator < r2.Iterator; } bool operator>(const type &r2) { return Iterator > r2.Iterator; } bool operator<=(const type &r2) { return Iterator <= r2.Iterator; } bool operator>=(const type &r2) { return Iterator >= r2.Iterator; } template type operator+(const IteratorWrapper &r2) { return type(Iterator + r2.Iterator); } template difference_type operator-(const IteratorWrapper &r2) { return Iterator - r2.Iterator; } private: W Iterator; };