@@ -300,7 +300,16 @@ struct __forward_node_traits {
300
300
return __p;
301
301
}
302
302
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node (__node_pointer __p) {
303
- return __p ? pointer_traits<__begin_node_pointer>::pointer_to (*__p) : static_cast <__begin_node_pointer>(nullptr );
303
+ # ifdef _LIBCPP_CXX03_LANG
304
+ return static_cast <__begin_node_pointer>(__p);
305
+ # else
306
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
307
+ return static_cast <__begin_node_pointer>(__p);
308
+ } else {
309
+ return __p ? __begin_node_pointer::pointer_to (*static_cast <__begin_node*>(std::addressof (*__p)))
310
+ : static_cast <__begin_node_pointer>(nullptr );
311
+ }
312
+ # endif
304
313
}
305
314
};
306
315
@@ -315,8 +324,16 @@ struct __forward_begin_node {
315
324
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_begin_node (pointer __n) : __next_(__n) {}
316
325
317
326
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __next_as_begin () const {
318
- return __next_ ? pointer_traits<__begin_node_pointer>::pointer_to (*__next_)
319
- : static_cast <__begin_node_pointer>(nullptr );
327
+ # ifdef _LIBCPP_CXX03_LANG
328
+ return static_cast <__begin_node_pointer>(__next_);
329
+ # else
330
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
331
+ return static_cast <__begin_node_pointer>(__next_);
332
+ } else {
333
+ return __next_ ? __begin_node_pointer::pointer_to (*static_cast <__forward_begin_node*>(std::addressof (*__next_)))
334
+ : static_cast <__begin_node_pointer>(nullptr );
335
+ }
336
+ # endif
320
337
}
321
338
};
322
339
@@ -363,6 +380,7 @@ template <class _NodePtr>
363
380
class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
364
381
typedef __forward_node_traits<_NodePtr> __traits;
365
382
typedef typename __traits::__node_type __node_type;
383
+ typedef typename __traits::__begin_node __begin_node_type;
366
384
typedef typename __traits::__node_pointer __node_pointer;
367
385
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
368
386
typedef typename __traits::__void_pointer __void_pointer;
@@ -371,9 +389,17 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {
371
389
372
390
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
373
391
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
374
- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
375
- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
376
- : static_cast <__node_pointer>(nullptr );
392
+ # ifdef _LIBCPP_CXX03_LANG
393
+ return static_cast <__node_pointer>(__ptr_);
394
+ # else
395
+ if constexpr (std::is_pointer<__node_pointer>::value) {
396
+ return static_cast <__node_pointer>(__ptr_);
397
+ } else {
398
+ return __ptr_ ? __node_pointer::pointer_to (
399
+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
400
+ : static_cast <__node_pointer>(nullptr );
401
+ }
402
+ # endif
377
403
}
378
404
379
405
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator (nullptr_t ) _NOEXCEPT
@@ -434,6 +460,7 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
434
460
435
461
typedef __forward_node_traits<_NodePtr> __traits;
436
462
typedef typename __traits::__node_type __node_type;
463
+ typedef typename __traits::__begin_node __begin_node_type;
437
464
typedef typename __traits::__node_pointer __node_pointer;
438
465
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
439
466
typedef typename __traits::__void_pointer __void_pointer;
@@ -442,9 +469,17 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {
442
469
443
470
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin () const { return __ptr_; }
444
471
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer () const {
445
- return __ptr_ ? pointer_traits<__node_pointer>::pointer_to (
446
- const_cast <__node_type&>(static_cast <const __node_type&>(*__ptr_)))
447
- : static_cast <__node_pointer>(nullptr );
472
+ # ifdef _LIBCPP_CXX03_LANG
473
+ return static_cast <__node_pointer>(__ptr_);
474
+ # else
475
+ if constexpr (std::is_pointer<__node_pointer>::value) {
476
+ return static_cast <__node_pointer>(__ptr_);
477
+ } else {
478
+ return __ptr_ ? __node_pointer::pointer_to (
479
+ *static_cast <__node_type*>(const_cast <__begin_node_type*>(std::addressof (*__ptr_))))
480
+ : static_cast <__node_pointer>(nullptr );
481
+ }
482
+ # endif
448
483
}
449
484
450
485
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator (nullptr_t ) _NOEXCEPT
@@ -518,10 +553,27 @@ protected:
518
553
_LIBCPP_COMPRESSED_PAIR (__begin_node, __before_begin_, __node_allocator, __alloc_);
519
554
520
555
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () _NOEXCEPT {
556
+ # ifdef _LIBCPP_CXX03_LANG
521
557
return pointer_traits<__begin_node_pointer>::pointer_to (__before_begin_);
558
+ # else
559
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
560
+ return std::addressof (__before_begin_);
561
+ } else {
562
+ return __begin_node_pointer::pointer_to (*std::addressof (__before_begin_));
563
+ }
564
+ # endif
522
565
}
566
+
523
567
_LIBCPP_CONSTEXPR_SINCE_CXX26 _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __before_begin () const _NOEXCEPT {
568
+ # ifdef _LIBCPP_CXX03_LANG
524
569
return pointer_traits<__begin_node_pointer>::pointer_to (const_cast <__begin_node&>(__before_begin_));
570
+ # else
571
+ if constexpr (std::is_pointer<__begin_node_pointer>::value) {
572
+ return const_cast <__begin_node*>(std::addressof (__before_begin_));
573
+ } else {
574
+ return __begin_node_pointer::pointer_to (*const_cast <__begin_node*>(std::addressof (__before_begin_)));
575
+ }
576
+ # endif
525
577
}
526
578
527
579
typedef __forward_list_iterator<__node_pointer> iterator;
0 commit comments