@@ -200,6 +200,8 @@ class directory_entry {
200
200
_Empty,
201
201
_IterSymlink,
202
202
_IterNonSymlink,
203
+ _IterCachedSymlink,
204
+ _IterCachedNonSymlink,
203
205
_RefreshSymlink,
204
206
_RefreshSymlinkUnresolved,
205
207
_RefreshNonSymlink
@@ -241,6 +243,28 @@ class directory_entry {
241
243
return __data;
242
244
}
243
245
246
+ _LIBCPP_HIDE_FROM_ABI static __cached_data __create_iter_cached_result (file_type __ft, uintmax_t __size, perms __perm, file_time_type __write_time) {
247
+ __cached_data __data;
248
+ __data.__type_ = __ft;
249
+ __data.__size_ = __size;
250
+ __data.__write_time_ = __write_time;
251
+ if (__ft == file_type::symlink)
252
+ __data.__sym_perms_ = __perm;
253
+ else
254
+ __data.__non_sym_perms_ = __perm;
255
+ __data.__cache_type_ = [&]() {
256
+ switch (__ft) {
257
+ case file_type::none:
258
+ return _Empty;
259
+ case file_type::symlink:
260
+ return _IterCachedSymlink;
261
+ default :
262
+ return _IterCachedNonSymlink;
263
+ }
264
+ }();
265
+ return __data;
266
+ }
267
+
244
268
_LIBCPP_HIDE_FROM_ABI void __assign_iter_entry (_Path&& __p, __cached_data __dt) {
245
269
__p_ = std::move (__p);
246
270
__data_ = __dt;
@@ -282,12 +306,14 @@ class directory_entry {
282
306
case _Empty:
283
307
return __symlink_status (__p_, __ec).type ();
284
308
case _IterSymlink:
309
+ case _IterCachedSymlink:
285
310
case _RefreshSymlink:
286
311
case _RefreshSymlinkUnresolved:
287
312
if (__ec)
288
313
__ec->clear ();
289
314
return file_type::symlink;
290
315
case _IterNonSymlink:
316
+ case _IterCachedNonSymlink:
291
317
case _RefreshNonSymlink:
292
318
file_status __st (__data_.__type_ );
293
319
if (__ec && !filesystem::exists (__st))
@@ -303,9 +329,11 @@ class directory_entry {
303
329
switch (__data_.__cache_type_ ) {
304
330
case _Empty:
305
331
case _IterSymlink:
332
+ case _IterCachedSymlink:
306
333
case _RefreshSymlinkUnresolved:
307
334
return __status (__p_, __ec).type ();
308
335
case _IterNonSymlink:
336
+ case _IterCachedNonSymlink:
309
337
case _RefreshNonSymlink:
310
338
case _RefreshSymlink: {
311
339
file_status __st (__data_.__type_ );
@@ -324,8 +352,10 @@ class directory_entry {
324
352
case _Empty:
325
353
case _IterNonSymlink:
326
354
case _IterSymlink:
355
+ case _IterCachedSymlink:
327
356
case _RefreshSymlinkUnresolved:
328
357
return __status (__p_, __ec);
358
+ case _IterCachedNonSymlink:
329
359
case _RefreshNonSymlink:
330
360
case _RefreshSymlink:
331
361
return file_status (__get_ft (__ec), __data_.__non_sym_perms_ );
@@ -339,8 +369,10 @@ class directory_entry {
339
369
case _IterNonSymlink:
340
370
case _IterSymlink:
341
371
return __symlink_status (__p_, __ec);
372
+ case _IterCachedNonSymlink:
342
373
case _RefreshNonSymlink:
343
374
return file_status (__get_sym_ft (__ec), __data_.__non_sym_perms_ );
375
+ case _IterCachedSymlink:
344
376
case _RefreshSymlink:
345
377
case _RefreshSymlinkUnresolved:
346
378
return file_status (__get_sym_ft (__ec), __data_.__sym_perms_ );
@@ -353,8 +385,10 @@ class directory_entry {
353
385
case _Empty:
354
386
case _IterNonSymlink:
355
387
case _IterSymlink:
388
+ case _IterCachedSymlink:
356
389
case _RefreshSymlinkUnresolved:
357
390
return filesystem::__file_size (__p_, __ec);
391
+ case _IterCachedNonSymlink:
358
392
case _RefreshSymlink:
359
393
case _RefreshNonSymlink: {
360
394
error_code __m_ec;
@@ -375,6 +409,8 @@ class directory_entry {
375
409
case _Empty:
376
410
case _IterNonSymlink:
377
411
case _IterSymlink:
412
+ case _IterCachedNonSymlink:
413
+ case _IterCachedSymlink:
378
414
case _RefreshSymlinkUnresolved:
379
415
return filesystem::__hard_link_count (__p_, __ec);
380
416
case _RefreshSymlink:
@@ -395,6 +431,8 @@ class directory_entry {
395
431
case _IterSymlink:
396
432
case _RefreshSymlinkUnresolved:
397
433
return filesystem::__last_write_time (__p_, __ec);
434
+ case _IterCachedNonSymlink:
435
+ case _IterCachedSymlink:
398
436
case _RefreshSymlink:
399
437
case _RefreshNonSymlink: {
400
438
error_code __m_ec;
0 commit comments