From 21581141f6f3d4049fa80f877a85bcf9229deab3 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Tue, 28 Apr 2020 02:47:38 +0800 Subject: [PATCH] Support range-based iteration in IndexRange class --- src/base/bittorrent/torrenthandleimpl.cpp | 4 +- src/base/indexrange.h | 57 ++++++++++++++++++++--- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/base/bittorrent/torrenthandleimpl.cpp b/src/base/bittorrent/torrenthandleimpl.cpp index 53f654d1d..431825a60 100644 --- a/src/base/bittorrent/torrenthandleimpl.cpp +++ b/src/base/bittorrent/torrenthandleimpl.cpp @@ -2133,9 +2133,9 @@ QVector TorrentHandleImpl::availableFileFractions() const const TorrentInfo::PieceRange filePieces = info.filePieces(i); int availablePieces = 0; - for (int piece = filePieces.first(); piece <= filePieces.last(); ++piece) { + for (const int piece : filePieces) availablePieces += (piecesAvailability[piece] > 0) ? 1 : 0; - } + res.push_back(static_cast(availablePieces) / filePieces.size()); } return res; diff --git a/src/base/indexrange.h b/src/base/indexrange.h index a297d76ed..85af9d3e9 100644 --- a/src/base/indexrange.h +++ b/src/base/indexrange.h @@ -38,7 +38,8 @@ class IndexInterval public: using IndexType = Index; - IndexInterval(IndexType first, IndexType last) // add constexpr when using C++17 + // TODO: add constexpr when using C++17 + IndexInterval(const IndexType first, const IndexType last) : m_first {first} , m_last {last} { @@ -61,7 +62,7 @@ private: }; template -constexpr IndexInterval makeInterval(T first, T last) +constexpr IndexInterval makeInterval(const T first, const T last) { return {first, last}; } @@ -74,13 +75,55 @@ public: using IndexType = Index; using IndexDiffType = IndexDiff; + class Iterator + { + public: + explicit constexpr Iterator(const IndexType index) + : m_index {index} + { + } + + constexpr Iterator(const Iterator &) = default; + + constexpr IndexType operator*() const + { + return m_index; + } + + constexpr Iterator &operator++() + { + ++m_index; + return *this; + } + + constexpr Iterator operator++(int) + { + const Iterator iter {*this}; + ++(*this); + return iter; + } + + constexpr bool operator==(const Iterator &other) const + { + return (*(*this) == *other); + } + + constexpr bool operator!=(const Iterator &other) const + { + return !(*this == other); + } + + private: + IndexType m_index; + }; + constexpr IndexRange() : m_first {0} , m_size {0} { } - constexpr IndexRange(IndexType first, IndexDiffType size) + constexpr IndexRange(const IndexType first, const IndexDiffType size) : m_first {first} , m_size {size} { @@ -92,14 +135,14 @@ public: { } - constexpr IndexType begin() const + constexpr Iterator begin() const { - return m_first; + return Iterator {m_first}; } - constexpr IndexType end() const + constexpr Iterator end() const { - return (m_first + m_size); + return Iterator {m_first + m_size}; } constexpr IndexDiffType size() const