@@ -296,7 +296,16 @@ struct __forward_node_traits {
296
296
# endif
297
297
298
298
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node (__node_pointer __p) {
299
- return __p ? pointer_traits<__begin_node_pointer>::pointer_to (*__p) : static_cast <__begin_node_pointer>(nullptr );
299
+ # ifdef _LIBCPP_CXX03_LANG
300
+ return static_cast <__begin_node_pointer>(__p);
301
+ # else
302
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
303
+ return static_cast <__begin_node_pointer>(__p);
304
+ } else {
305
+ return __p ? __begin_node_pointer::pointer_to (*static_cast <__begin_node*>(std::addressof (*__p)))
306
+ : static_cast <__begin_node_pointer>(nullptr );
307
+ }
308
+ # endif
300
309
}
301
310
};
302
311
@@ -311,8 +320,16 @@ struct __forward_begin_node {
311
320
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_begin_node (pointer __n) : __next_(__n) {}
312
321
313
322
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __next_as_begin () const {
314
- return __next_ ? pointer_traits<__begin_node_pointer>::pointer_to (*__next_)
315
- : static_cast <__begin_node_pointer>(nullptr );
323
+ # ifdef _LIBCPP_CXX03_LANG
324
+ return static_cast <__begin_node_pointer>(__next_);
325
+ # else
326
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
327
+ return static_cast <__begin_node_pointer>(__next_);
328
+ } else {
329
+ return __next_ ? __begin_node_pointer::pointer_to (*static_cast <__forward_begin_node*>(std::addressof (*__next_)))
330
+ : static_cast <__begin_node_pointer>(nullptr );
331
+ }
332
+ # endif
316
333
}
317
334
};
318
335
@@ -359,6 +376,7 @@ template <class _NodePtr>
359
376
class __forward_list_iterator {
360
377
typedef __forward_node_traits<_NodePtr> __traits;
361
378
typedef typename __traits::__node_type __node_type;
379
+ typedef typename __traits::__begin_node __begin_node_type;
362
380
typedef typename __traits::__node_pointer __node_pointer;
363
381
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
364
382
typedef typename __traits::__void_pointer __void_pointer;
@@ -367,9 +385,17 @@ class __forward_list_iterator {
367
385
368
386
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
369
387
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
370
- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
371
- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
372
- : static_cast <__node_pointer>(nullptr );
388
+ # ifdef _LIBCPP_CXX03_LANG
389
+ return static_cast <__node_pointer>(__ptr_);
390
+ # else
391
+ if constexpr (std::is_pointer<__node_pointer>::value) {
392
+ return static_cast <__node_pointer>(__ptr_);
393
+ } else {
394
+ return __ptr_ ? __node_pointer::pointer_to (
395
+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
396
+ : static_cast <__node_pointer>(nullptr );
397
+ }
398
+ # endif
373
399
}
374
400
375
401
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator (nullptr_t ) _NOEXCEPT
@@ -429,6 +455,7 @@ class __forward_list_const_iterator {
429
455
430
456
typedef __forward_node_traits<_NodePtr> __traits;
431
457
typedef typename __traits::__node_type __node_type;
458
+ typedef typename __traits::__begin_node __begin_node_type;
432
459
typedef typename __traits::__node_pointer __node_pointer;
433
460
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
434
461
typedef typename __traits::__void_pointer __void_pointer;
@@ -437,9 +464,17 @@ class __forward_list_const_iterator {
437
464
438
465
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
439
466
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
440
- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
441
- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
442
- : static_cast <__node_pointer>(nullptr );
467
+ # ifdef _LIBCPP_CXX03_LANG
468
+ return static_cast <__node_pointer>(__ptr_);
469
+ # else
470
+ if constexpr (std::is_pointer<__node_pointer>::value) {
471
+ return static_cast <__node_pointer>(__ptr_);
472
+ } else {
473
+ return __ptr_ ? __node_pointer::pointer_to (
474
+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
475
+ : static_cast <__node_pointer>(nullptr );
476
+ }
477
+ # endif
443
478
}
444
479
445
480
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator (nullptr_t ) _NOEXCEPT
@@ -512,10 +547,27 @@ protected:
512
547
_LIBCPP_COMPRESSED_PAIR (__begin_node, __before_begin_, __node_allocator, __alloc_);
513
548
514
549
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () _NOEXCEPT {
550
+ # ifdef _LIBCPP_CXX03_LANG
515
551
return pointer_traits<__begin_node_pointer>::pointer_to (__before_begin_);
552
+ # else
553
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
554
+ return std::addressof (__before_begin_);
555
+ } else {
556
+ return __begin_node_pointer::pointer_to (*std::addressof (__before_begin_));
557
+ }
558
+ # endif
516
559
}
560
+
517
561
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () const _NOEXCEPT {
562
+ # ifdef _LIBCPP_CXX03_LANG
518
563
return pointer_traits<__begin_node_pointer>::pointer_to (const_cast <__begin_node&>(__before_begin_));
564
+ # else
565
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
566
+ return const_cast <__begin_node*>(std::addressof (__before_begin_));
567
+ } else {
568
+ return __begin_node_pointer::pointer_to (*const_cast <__begin_node*>(std::addressof (__before_begin_)));
569
+ }
570
+ # endif
519
571
}
520
572
521
573
typedef __forward_list_iterator<__node_pointer> iterator;
0 commit comments