File indexing completed on 2024-04-21 05:48:30

0001 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0002 // SPDX-FileCopyrightText: 2022 Harald Sitter <sitter@kde.org>
0003 
0004 #pragma once
0005 
0006 #include "directoryEntry.h"
0007 #include <memory>
0008 
0009 #ifdef Q_OS_WINDOWS
0010 #include "windowsWalker.h"
0011 template<class T = WindowsWalker>
0012 #else
0013 #include "posixWalker.h"
0014 template<class T = POSIXWalker>
0015 #endif
0016 class DirectoryIterator
0017 {
0018 public:
0019     using value_type = DirectoryEntry;
0020     using difference_type = std::ptrdiff_t;
0021     using pointer = const DirectoryEntry *;
0022     using reference = const DirectoryEntry &;
0023     using iterator_category = std::input_iterator_tag;
0024 
0025     DirectoryIterator() = default;
0026     explicit DirectoryIterator(const QByteArray &path)
0027         : m_walker(std::make_shared<T>(path))
0028     {
0029     }
0030 
0031     const DirectoryEntry &operator*() const
0032     {
0033         return m_walker->m_entry;
0034     };
0035 
0036     DirectoryIterator &operator++()
0037     {
0038         m_walker->next();
0039         return *this;
0040     }
0041 
0042     std::shared_ptr<T> m_walker = std::make_shared<T>(QByteArray()); // always have a valid walker to simplify accessing into it
0043 private:
0044     friend bool operator==(const DirectoryIterator &lhs, const DirectoryIterator &rhs) noexcept
0045     {
0046         return lhs.m_walker->m_entry.name == rhs.m_walker->m_entry.name;
0047     }
0048 
0049     friend bool operator!=(const DirectoryIterator &lhs, const DirectoryIterator &rhs) noexcept
0050     {
0051         return !(lhs == rhs);
0052     }
0053 };
0054 
0055 template<class T>
0056 DirectoryIterator<T> begin(DirectoryIterator<T> iter) noexcept
0057 {
0058     return DirectoryIterator<T>(iter.m_walker->m_path);
0059 }
0060 
0061 template<class T>
0062 DirectoryIterator<T> end(DirectoryIterator<T> iter) noexcept
0063 {
0064     Q_UNUSED(iter);
0065     return {};
0066 }