Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qdirentryinfo_p.h
Go to the documentation of this file.
1
// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
ifndef
QDIRENTRYINFO_P_H
6
#
define
QDIRENTRYINFO_P_H
7
8
//
9
// W A R N I N G
10
// -------------
11
//
12
// This file is not part of the Qt API. It exists purely as an
13
// implementation detail. This header file may change from version to
14
// version without notice, or even be removed.
15
//
16
// We mean it.
17
//
18
19
#
include
<
QtCore
/
qassert
.
h
>
20
#
include
<
QtCore
/
private
/
qfileinfo_p
.
h
>
21
#
include
<
QtCore
/
private
/
qfilesystementry_p
.
h
>
22
#
include
<
QtCore
/
private
/
qfilesystemmetadata_p
.
h
>
23
24
#
include
<
type_traits
>
25
#
include
<
QtCore
/
q23utility
.
h
>
26
#
include
<
variant
>
27
28
QT_BEGIN_NAMESPACE
29
30
namespace
QDirEntryInfoPrivate
{
31
template
<
class
... Ts>
32
struct
overloaded
: Ts... {
using
Ts::operator()...; };
33
template
<
class
... Ts>
34
overloaded
(Ts...) ->
overloaded
<Ts...>;
35
36
template
<
typename
T,
typename
Variant,
typename
...Args>
37
T &
emplace
(Variant &v, Args&&...args)
38
{
39
#
if
!
defined
(
Q_OS_VXWORKS
)
/* lacks LWG 2857 resolution */
40
&&
!
defined
(
Q_CC_COVERITY
)
/* would report "structurally dead code" */
41
/* end */
42
return
43
#
endif
44
v.
template
emplace<T>(
std
::forward<Args>(args)...);
45
return
*
std
::get_if<T>(&v);
46
}
47
48
//
49
// Reimplementation of std::visit() to fight Coverity's UNCAUGHT_EXCEPTION
50
//
51
// This version never throws std::bad_variant_access (unless thrown by the
52
// visitor), but Q_UNREACHABLE()s the valueless_by_exception() case. It should
53
// otherwise be identical to std::visit(), incl. the O(1) access.
54
//
55
// Known limitations:
56
// - at most three alternatives are supported (but more can be trivially added)
57
// - only one variant is supported (unary visitor; binary visitation isn't)
58
// - only works for "raw" std::variant, not "anything inheriting std::variant"
59
//
60
template
<
typename
Visitor,
typename
Variant>
61
constexpr
decltype
(
auto
)
visit
(Visitor &&vis, Variant &&var)
62
{
63
using
V = std::remove_reference_t<Variant>;
64
constexpr
auto
NumAlternatives = std::variant_size_v<V>;
65
switch
(var.index()) {
66
#
define
QT_VARIANT_VISIT_CASE
(
num
)
67
case
num
:
68
if
constexpr
(
NumAlternatives
>
num
)
{
69
const
auto
p
=
std
::
get_if
<
num
>
(
&
var
)
;
70
return
std
::
forward
<
Visitor
>
(
vis
)
(
q23
::
forward_like
<
Variant
>
(
*
p
)
)
;
71
}
72
break
73
/* end */
74
QT_VARIANT_VISIT_CASE
(0);
75
QT_VARIANT_VISIT_CASE
(1);
76
QT_VARIANT_VISIT_CASE
(2);
77
static_assert
(NumAlternatives <= 3,
"### extend this switch if you need more"
);
78
#
undef
QT_VARIANT_VISIT_CASE
79
}
80
Q_UNREACHABLE();
81
}
82
83
}
// namespace QDirEntryInfoPrivate
84
85
class
QDirEntryInfo
86
{
87
template
<
typename
QueryNative,
typename
QueryFileInfo,
typename
QueryIterator>
88
decltype
(
auto
) visit(QueryNative qn, QueryFileInfo qf, QueryIterator qi)
89
{
90
auto
visitor =
QDirEntryInfoPrivate
::
overloaded
{
std
::move(qn),
std
::move(qf),
std
::move(qi)};
91
return
QDirEntryInfoPrivate
::visit(
std
::move(visitor), content);
92
}
93
template
<
typename
QueryNative,
typename
QueryFileInfo,
typename
QueryIterator>
94
auto
query(
95
QueryNative &&queryNative, QueryFileInfo &&queryFileInfo, QueryIterator &&queryIterator)
96
{
97
return
visit(
98
std
::forward<QueryNative>(queryNative),
99
std
::forward<QueryFileInfo>(queryFileInfo),
100
[&](
const
Iterator &iterator) {
return
queryIterator(iterator.iterator); }
101
);
102
}
103
104
template
<
typename
QueryNative,
typename
QueryFileInfo>
105
auto
query(QueryNative &&queryNative,
const
QueryFileInfo &queryFileInfo)
106
{
107
return
visit(
108
std
::forward<QueryNative>(queryNative),
109
[&](Iterator &iterator) {
return
queryFileInfo(iterator.ensureFileInfo()); },
110
queryFileInfo
111
);
112
}
113
114
public
:
115
QDirEntryInfo
() =
default
;
116
117
explicit
QDirEntryInfo
(
const
QAbstractFileEngineIterator *iterator)
118
:
content
(
Iterator
{
iterator
, {}})
119
{
120
}
121
122
explicit
QDirEntryInfo
(QFileSystemEntry &&e, QFileSystemMetaData &&md)
123
:
content
(
Native
{
std
::
move
(
e
),
std
::
move
(
md
) })
124
{
125
}
126
127
explicit
QDirEntryInfo
(QFileInfo &&info)
128
:
content
(
std
::
move
(
info
))
129
{
130
}
131
132
const
QFileInfo &
fileInfo
()
133
{
134
return
visit(
135
[](Iterator &iterator) ->
const
QFileInfo & {
return
iterator.ensureFileInfo(); },
136
[
this
](
const
Native &native) ->
const
QFileInfo & {
137
return
QDirEntryInfoPrivate
::emplace<QFileInfo>(content,
138
new
QFileInfoPrivate(native.entry, native.metaData));
139
},
140
[](
const
QFileInfo &fileInfo) ->
const
QFileInfo & {
return
fileInfo; }
141
);
142
}
143
144
QString
fileName
()
145
{
146
return
query(
147
[](
const
Native &native) {
return
native.entry.fileName(); },
148
[](
const
QFileInfo &info) {
return
info.fileName(); },
149
[](
const
QAbstractFileEngineIterator *it) {
return
it->currentFileName(); });
150
}
151
152
QString
baseName
()
153
{
154
return
query(
155
[](
const
Native &native) {
return
native.entry.baseName(); },
156
[](
const
QFileInfo &info) {
return
info.baseName(); });
157
}
158
159
QString
completeBaseName
()
160
{
161
return
query(
162
[](
const
Native &native) {
return
native.entry.completeBaseName(); },
163
[](
const
QFileInfo &info) {
return
info.completeBaseName(); });
164
}
165
166
QString
suffix
()
167
{
168
return
query(
169
[](
const
Native &native) {
return
native.entry.suffix(); },
170
[](
const
QFileInfo &info) {
return
info.suffix(); });
171
}
172
173
QString
completeSuffix
()
174
{
175
return
query(
176
[](
const
Native &native) {
return
native.entry.completeSuffix(); },
177
[](
const
QFileInfo &info) {
return
info.completeSuffix(); });
178
}
179
180
QString
filePath
()
181
{
182
return
query(
183
[](
const
Native &native) {
return
native.entry.filePath(); },
184
[](
const
QFileInfo &info) {
return
info.filePath(); },
185
[](
const
QAbstractFileEngineIterator *it) {
return
it->currentFilePath(); });
186
}
187
188
QString
bundleName
() {
return
fileInfo
(
)
.bundleName(); }
189
190
QString
canonicalFilePath
()
191
{
192
// QFileInfo caches these strings
193
return
fileInfo
(
)
.canonicalFilePath();
194
}
195
196
QString
absoluteFilePath
() {
197
// QFileInfo caches these strings
198
return
fileInfo
(
)
.absoluteFilePath();
199
}
200
201
QString
absolutePath
() {
202
// QFileInfo caches these strings
203
return
fileInfo
(
)
.absolutePath();
204
}
205
206
207
bool
isDir
() {
208
return
query(
209
[](Native &native) {
210
return
native.ensureFilled(QFileSystemMetaData::DirectoryType).isDirectory();
211
},
212
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isDir(); });
213
}
214
215
bool
isFile
() {
216
return
query(
217
[](Native &native) {
218
return
native.ensureFilled(QFileSystemMetaData::FileType).isFile();
219
},
220
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isFile(); });
221
}
222
223
bool
isSymLink
() {
224
return
query(
225
[](Native &native) {
226
return
native.ensureFilled(QFileSystemMetaData::LegacyLinkType).isLegacyLink();
227
},
228
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isSymLink(); });
229
}
230
231
bool
isSymbolicLink
() {
232
return
query(
233
[](Native &native) {
234
return
native.ensureFilled(QFileSystemMetaData::LinkType).isLink();
235
},
236
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isSymbolicLink(); });
237
}
238
239
bool
isJunction
() {
240
return
query(
241
[](Native &native) {
242
return
native.ensureFilled(QFileSystemMetaData::LinkType).isJunction();
243
},
244
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isJunction(); });
245
}
246
247
QString
junctionTarget
() {
248
return
query(
249
[](Native &native) {
250
return
QFileSystemEngine::getJunctionTarget(native.entry, native.metaData).filePath();
251
},
252
[](
const
QFileInfo &fileInfo) {
return
fileInfo.junctionTarget(); });
253
}
254
255
bool
exists
() {
256
return
query(
257
[](Native &native) {
258
return
native.ensureFilled(QFileSystemMetaData::ExistsAttribute).exists();
259
},
260
[](
const
QFileInfo &fileInfo) {
return
fileInfo.exists(); });
261
}
262
263
bool
isHidden
() {
264
return
query(
265
[](Native &native) {
266
return
native.ensureFilled(QFileSystemMetaData::HiddenAttribute).isHidden();
267
},
268
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isHidden(); });
269
}
270
271
bool
isReadable
() {
272
return
query(
273
[](Native &native) {
274
return
native.ensureFilled(QFileSystemMetaData::UserReadPermission).isReadable();
275
},
276
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isReadable(); });
277
}
278
279
bool
isWritable
() {
280
return
query(
281
[](Native &native) {
282
return
native.ensureFilled(QFileSystemMetaData::UserWritePermission).isWritable();
283
},
284
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isWritable(); });
285
}
286
287
bool
isExecutable
() {
288
return
query(
289
[](Native &native) {
290
return
native.ensureFilled(QFileSystemMetaData::UserExecutePermission)
291
.isExecutable();
292
},
293
[](
const
QFileInfo &fileInfo) {
return
fileInfo.isExecutable(); });
294
}
295
296
qint64
size
() {
return
fileInfo
(
)
.size(); }
297
298
QDateTime
fileTime
(QFile::FileTime type,
const
QTimeZone &tz)
299
{
300
return
fileInfo
(
)
.fileTime(type, tz);
301
}
302
303
private
:
304
friend
class
QDirListingPrivate
;
305
friend
class
QDirListing
;
306
friend
class
QFileSystemIterator;
307
friend
class
QFSFileEngineIterator
;
308
309
struct
Iterator
310
{
311
// The data we can query from both the QFileInfo and the iterator is cheaper to retrieve
312
// from the iterator. Therefore, keep the iterator around even if we create a the QFileInfo.
313
const
QAbstractFileEngineIterator *iterator =
nullptr
;
314
std
::optional<QFileInfo> fileInfo;
315
316
const
QFileInfo &ensureFileInfo()
317
{
318
if
(!fileInfo.has_value())
319
fileInfo = iterator->currentFileInfo();
320
return
*fileInfo;
321
}
322
};
323
324
struct
Native
325
{
326
QFileSystemEntry entry;
327
QFileSystemMetaData metaData;
328
329
const
QFileSystemMetaData &ensureFilled(QFileSystemMetaData::MetaDataFlag what)
330
{
331
if
(!metaData.hasFlags(what))
332
QFileSystemEngine::fillMetaData(entry, metaData, what);
333
return
metaData;
334
}
335
};
336
337
std
::variant<Native, QFileInfo, Iterator> content;
338
};
339
340
QT_END_NAMESPACE
341
342
#
endif
// QDIRENTRYINFO_P_H
QDirEntryInfo
Definition
qdirentryinfo_p.h:86
QDirEntryInfo::isReadable
bool isReadable()
Definition
qdirentryinfo_p.h:271
QDirEntryInfo::baseName
QString baseName()
Definition
qdirentryinfo_p.h:152
QDirEntryInfo::isWritable
bool isWritable()
Definition
qdirentryinfo_p.h:279
QDirEntryInfo::QDirEntryInfo
QDirEntryInfo(QFileSystemEntry &&e, QFileSystemMetaData &&md)
Definition
qdirentryinfo_p.h:122
QDirEntryInfo::junctionTarget
QString junctionTarget()
Definition
qdirentryinfo_p.h:247
QDirEntryInfo::filePath
QString filePath()
Definition
qdirentryinfo_p.h:180
QDirEntryInfo::isSymLink
bool isSymLink()
Definition
qdirentryinfo_p.h:223
QDirEntryInfo::fileInfo
const QFileInfo & fileInfo()
Definition
qdirentryinfo_p.h:132
QDirEntryInfo::absoluteFilePath
QString absoluteFilePath()
Definition
qdirentryinfo_p.h:196
QDirEntryInfo::canonicalFilePath
QString canonicalFilePath()
Definition
qdirentryinfo_p.h:190
QDirEntryInfo::completeSuffix
QString completeSuffix()
Definition
qdirentryinfo_p.h:173
QDirEntryInfo::isExecutable
bool isExecutable()
Definition
qdirentryinfo_p.h:287
QDirEntryInfo::fileTime
QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz)
Definition
qdirentryinfo_p.h:298
QDirEntryInfo::isFile
bool isFile()
Definition
qdirentryinfo_p.h:215
QDirEntryInfo::QDirEntryInfo
QDirEntryInfo(QFileInfo &&info)
Definition
qdirentryinfo_p.h:127
QDirEntryInfo::suffix
QString suffix()
Definition
qdirentryinfo_p.h:166
QDirEntryInfo::QDirEntryInfo
QDirEntryInfo()=default
QDirEntryInfo::size
qint64 size()
Definition
qdirentryinfo_p.h:296
QDirEntryInfo::isHidden
bool isHidden()
Definition
qdirentryinfo_p.h:263
QDirEntryInfo::isJunction
bool isJunction()
Definition
qdirentryinfo_p.h:239
QDirEntryInfo::isSymbolicLink
bool isSymbolicLink()
Definition
qdirentryinfo_p.h:231
QDirEntryInfo::QDirEntryInfo
QDirEntryInfo(const QAbstractFileEngineIterator *iterator)
Definition
qdirentryinfo_p.h:117
QDirEntryInfo::exists
bool exists()
Definition
qdirentryinfo_p.h:255
QDirEntryInfo::fileName
QString fileName()
Definition
qdirentryinfo_p.h:144
QDirEntryInfo::completeBaseName
QString completeBaseName()
Definition
qdirentryinfo_p.h:159
QDirEntryInfo::isDir
bool isDir()
Definition
qdirentryinfo_p.h:207
QDirEntryInfo::bundleName
QString bundleName()
Definition
qdirentryinfo_p.h:188
QDirEntryInfo::absolutePath
QString absolutePath()
Definition
qdirentryinfo_p.h:201
QDirIteratorPrivate
Definition
qdiriterator.cpp:103
QDirIteratorPrivate::QDirIteratorPrivate
QDirIteratorPrivate(const QString &path, const QStringList &nameFilters={}, QDir::Filters dirFilters=QDir::NoFilter, QDirIterator::IteratorFlags flags=QDirIterator::NoIteratorFlags)
Definition
qdiriterator.cpp:105
QDirIteratorPrivate::filters
QDir::Filters filters
Definition
qdiriterator.cpp:144
QDirIteratorPrivate::skipToNextMatch
void skipToNextMatch(QDirListing::const_iterator &iter)
Definition
qdiriterator.cpp:115
QDirIteratorPrivate::lister
QDirListing lister
Definition
qdiriterator.cpp:140
QDirIteratorPrivate::nextFileInfo
QFileInfo nextFileInfo
Definition
qdiriterator.cpp:143
QDirIteratorPrivate::advance
void advance()
Definition
qdiriterator.cpp:127
QDirIteratorPrivate::it
QDirListing::const_iterator it
Definition
qdiriterator.cpp:141
QDirIteratorPrivate::currentFileInfo
QFileInfo currentFileInfo
Definition
qdiriterator.cpp:142
QDirIterator
The QDirIterator class provides an iterator for directory entrylists.
Definition
qdiriterator.h:16
QDirListingPrivate
Definition
qdirlisting.cpp:165
QDirListing::DirEntry
\inmodule QtCore
Definition
qdirlisting.h:71
QDirListing::const_iterator
Definition
qdirlisting.h:114
QDirListing::const_iterator::operator*
reference operator*() const
Returns a {const QDirListing::DirEntry &} of the directory entry this iterator points to.
Definition
qdirlisting.h:130
QDirListing::const_iterator::operator++
const_iterator & operator++()
Pre-increment operator.
Definition
qdirlisting.h:132
QDirListing
Definition
qdirlisting.h:28
QFSFileEngineIterator
Definition
qfsfileengine_iterator_p.h:30
QDirEntryInfoPrivate
Definition
qdirentryinfo_p.h:30
QDirEntryInfoPrivate::visit
constexpr decltype(auto) visit(Visitor &&vis, Variant &&var)
Definition
qdirentryinfo_p.h:61
QDirEntryInfoPrivate::emplace
T & emplace(Variant &v, Args &&...args)
Definition
qdirentryinfo_p.h:37
QDirEntryInfoPrivate::overloaded
overloaded(Ts...) -> overloaded< Ts... >
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
QT_VARIANT_VISIT_CASE
#define QT_VARIANT_VISIT_CASE(num)
toDirListingFlags
static QDirListing::IteratorFlags toDirListingFlags(QDir::Filters filters, QDirIterator::IteratorFlags flags)
Definition
qdiriterator.cpp:89
QDirEntryInfoPrivate::overloaded
Definition
qdirentryinfo_p.h:32
qtbase
src
corelib
io
qdirentryinfo_p.h
Generated on
for Qt by
1.18.0