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 }