QDirListing: make const_iterator move-only
The std::input_iterator concept does not require copyable, only movable. This makes handling input_iterators safer, because copies of input iterators since advanced zap into partially-formed state without changing their bit pattern. If the iterator is, however, only movable, no such zapping copies can exist. Take advantage of this and make QDirListing::const_iterator move-only. Its iterators are anyway no longer compatible with classical STL algorithms, so we're not restricting their use further. Found in API review. Task-number: QTBUG-125512 Change-Id: Ic1dee22881893fdbf159bbfd335c10505eaffa9f Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> (cherry picked from commit 29dfcc240b3e29d5d6149c2996cfdb9d71b776bb) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
a1d4c64715
commit
46ec49894d
@ -35,7 +35,7 @@
|
|||||||
Iterators constructed by QDirListing (QDirListing::const_iterator)
|
Iterators constructed by QDirListing (QDirListing::const_iterator)
|
||||||
model C++20
|
model C++20
|
||||||
\l{https://en.cppreference.com/w/cpp/iterator/input_iterator}{std::input_iterator},
|
\l{https://en.cppreference.com/w/cpp/iterator/input_iterator}{std::input_iterator},
|
||||||
that is, they are
|
that is, they are move-only,
|
||||||
forward-only, single-pass iterators, that don't allow random access. They
|
forward-only, single-pass iterators, that don't allow random access. They
|
||||||
can be used in ranged-for loops (or with C++20 range algorithms that don't
|
can be used in ranged-for loops (or with C++20 range algorithms that don't
|
||||||
require random access iterators). Dereferencing a valid iterator returns
|
require random access iterators). Dereferencing a valid iterator returns
|
||||||
@ -673,6 +673,7 @@ QStringList QDirListing::nameFilters() const
|
|||||||
\list
|
\list
|
||||||
\li This is a forward-only, single-pass iterator (you cannot iterate
|
\li This is a forward-only, single-pass iterator (you cannot iterate
|
||||||
directory entries in reverse order)
|
directory entries in reverse order)
|
||||||
|
\li Can't be copied, only \c{std::move()}d.
|
||||||
\li Doesn't allow random access
|
\li Doesn't allow random access
|
||||||
\li Can be used in ranged-for loops; or with STL algorithms that don't
|
\li Can be used in ranged-for loops; or with STL algorithms that don't
|
||||||
require random access iterators
|
require random access iterators
|
||||||
@ -703,7 +704,8 @@ QDirListing::const_iterator QDirListing::begin() const
|
|||||||
{
|
{
|
||||||
d->beginIterating();
|
d->beginIterating();
|
||||||
const_iterator it{d};
|
const_iterator it{d};
|
||||||
return ++it;
|
++it;
|
||||||
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -102,6 +102,7 @@ public:
|
|||||||
|
|
||||||
class const_iterator
|
class const_iterator
|
||||||
{
|
{
|
||||||
|
Q_DISABLE_COPY(const_iterator)
|
||||||
friend class QDirListing;
|
friend class QDirListing;
|
||||||
explicit const_iterator(QDirListingPrivate *dp) { dirEntry.dirListPtr = dp; }
|
explicit const_iterator(QDirListingPrivate *dp) { dirEntry.dirListPtr = dp; }
|
||||||
DirEntry dirEntry;
|
DirEntry dirEntry;
|
||||||
@ -113,6 +114,9 @@ public:
|
|||||||
using reference = const value_type &;
|
using reference = const value_type &;
|
||||||
|
|
||||||
const_iterator() = default;
|
const_iterator() = default;
|
||||||
|
const_iterator(const_iterator &&) noexcept = default;
|
||||||
|
const_iterator &operator=(const_iterator &&) noexcept = default;
|
||||||
|
|
||||||
reference operator*() const { return dirEntry; }
|
reference operator*() const { return dirEntry; }
|
||||||
pointer operator->() const { return &dirEntry; }
|
pointer operator->() const { return &dirEntry; }
|
||||||
Q_CORE_EXPORT const_iterator &operator++();
|
Q_CORE_EXPORT const_iterator &operator++();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user