vendor/tomotopy/src/Utils/Utils.hpp in tomoto-0.1.3 vs vendor/tomotopy/src/Utils/Utils.hpp in tomoto-0.1.4

- old
+ new

@@ -68,11 +68,11 @@ assert(ret >= 0); return ret; } template<class UnaryFunction> - UnaryFunction forRandom(size_t N, size_t seed, UnaryFunction f) + UnaryFunction forShuffled(size_t N, size_t seed, UnaryFunction f) { static size_t primes[16] = { 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651 @@ -204,134 +204,139 @@ { return { filter, base, end }; } template <typename _UnaryFunc, typename _Iterator> - class TransformIter + class TransformIter : public _Iterator { private: - _Iterator i; _UnaryFunc f; public: using reference = typename std::result_of< const _UnaryFunc(typename std::iterator_traits<_Iterator>::reference) >::type; using value_type = reference; - - using pointer = void; - using iterator_category = typename std::iterator_traits<_Iterator>::iterator_category; - using difference_type = typename std::iterator_traits<_Iterator>::difference_type; - + TransformIter(const _Iterator& _iter = {}, _UnaryFunc _f = {}) - : i(_iter), f(_f) + : _Iterator(_iter), f(_f) {} reference operator*() { - return f(*i); + return f(_Iterator::operator*()); } const reference operator*() const { - return f(*i); + return f(_Iterator::operator*()); } reference operator[](std::size_t idx) { - return f(i[idx]); + return f(_Iterator::operator[](idx)); } const reference operator[](std::size_t idx) const { - return f(i[idx]); + return f(_Iterator::operator[](idx)); } TransformIter& operator++() { - ++i; + _Iterator::operator++(); return *this; } - TransformIter& operator++(int) + TransformIter operator++(int) { auto c = *this; - ++i; + _Iterator::operator++(); return c; } TransformIter& operator--() { - --i; + _Iterator::operator--(); return *this; } - TransformIter& operator--(int) + TransformIter operator--(int) { auto c = *this; - --i; + _Iterator::operator--(); return c; } TransformIter operator+(int n) const { - return { f, i + n }; + return { _Iterator::operator+(n), f }; } TransformIter operator-(int n) const { - return { f, i - n }; + return { _Iterator::operator-(n), f }; } TransformIter& operator+=(int n) { - i += n; + _Iterator::operator+=(n); return *this; } TransformIter& operator-=(int n) { - i -= n; + _Iterator::operator-=(n); return *this; } typename std::iterator_traits<_Iterator>::difference_type operator-(const TransformIter& o) const { - return i - o.i; + return (const _Iterator&)*this - (const _Iterator&)o; } - bool operator==(const TransformIter& o) const - { - return i == o.i; - } + }; - bool operator!=(const TransformIter& o) const - { - return i != o.i; - } + template <typename _UnaryFunc, typename _Iterator> + TransformIter<_UnaryFunc, _Iterator> makeTransformIter(const _Iterator& iter, _UnaryFunc f) + { + return { iter, f }; + } - bool operator<(const TransformIter& o) const + template <typename _Iterator> + class StrideIter : public _Iterator + { + size_t stride; + const _Iterator end; + public: + StrideIter(const _Iterator& iter, size_t _stride = 1, const _Iterator& _end = {}) + : _Iterator{ iter }, stride{ _stride }, end{ _end } { - return i < o.i; } - bool operator>(const TransformIter& o) const - { - return i > o.i; - } + StrideIter(const StrideIter&) = default; + StrideIter(StrideIter&&) = default; - bool operator<=(const TransformIter& o) const + StrideIter& operator++() { - return i <= o.i; + for (size_t i = 0; i < stride && *this != end; ++i) + { + _Iterator::operator++(); + } + return *this; } - bool operator>=(const TransformIter& o) const + StrideIter& operator--() { - return i >= o.i; + for (size_t i = 0; i < stride && *this != end; ++i) + { + _Iterator::operator--(); + } + return *this; } }; - template <typename _UnaryFunc, typename _Iterator> - TransformIter<_UnaryFunc, _Iterator> makeTransformIter(const _Iterator& iter, _UnaryFunc f) + template <typename _Iterator> + StrideIter<_Iterator> makeStrideIter(const _Iterator& iter, size_t stride, const _Iterator& end = {}) { - return { iter, f }; + return { iter, stride, end }; } }