@@ -233,6 +233,8 @@ private:
233
233
# endif // _LIBCPP_CXX03_LANG
234
234
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong (false_type) const ;
235
235
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong (true_type) const ;
236
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong (true_type, false_type) const ;
237
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong (true_type, true_type) const ;
236
238
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (false_type) const ;
237
239
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (true_type) const ;
238
240
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong (true_type, false_type) const ;
@@ -281,14 +283,23 @@ inline _LIBCPP_HIDE_FROM_ABI void __bitset<_N_words, _Size>::__init(unsigned lon
281
283
template <size_t _N_words, size_t _Size>
282
284
inline _LIBCPP_CONSTEXPR __bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
283
285
# ifndef _LIBCPP_CXX03_LANG
284
- # if __SIZEOF_SIZE_T__ == 8
285
- : __first_{__v}
286
- # elif __SIZEOF_SIZE_T__ == 4
286
+ # if (__SIZEOF_LONG_LONG__ + __SIZEOF_SIZE_T__ - 1) / __SIZEOF_SIZE_T__ == 1
287
+ : __first_{static_cast <__storage_type>(__v)}
288
+ # elif (__SIZEOF_LONG_LONG__ + __SIZEOF_SIZE_T__ - 1) / __SIZEOF_SIZE_T__ == 2
289
+ : __first_{static_cast <__storage_type>(__v), static_cast <__storage_type>(__v >> __bits_per_word)}
290
+ # elif (__SIZEOF_LONG_LONG__ + __SIZEOF_SIZE_T__ - 1) / __SIZEOF_SIZE_T__ == 4
291
+ # if _N_words == 2
292
+ : __first_{static_cast <__storage_type>(__v), static_cast <__storage_type>(__v >> __bits_per_word)}
293
+ # elif _N_words == 3
287
294
: __first_{static_cast <__storage_type>(__v),
288
- _Size >= 2 * __bits_per_word
289
- ? static_cast <__storage_type>(__v >> __bits_per_word)
290
- : static_cast <__storage_type>((__v >> __bits_per_word) &
291
- (__storage_type (1 ) << (_Size - __bits_per_word)) - 1 )}
295
+ static_cast <__storage_type>(__v >> __bits_per_word),
296
+ static_cast <__storage_type>(__v >> (__bits_per_word * 2 ))}
297
+ # else
298
+ : __first_{static_cast <__storage_type>(__v),
299
+ static_cast <__storage_type>(__v >> __bits_per_word),
300
+ static_cast <__storage_type>(__v >> (__bits_per_word * 2 )),
301
+ static_cast <__storage_type>(__v >> (__bits_per_word * 3 ))}
302
+ # endif
292
303
# else
293
304
# error This constructor has not been ported to this platform
294
305
# endif
@@ -344,13 +355,33 @@ __bitset<_N_words, _Size>::to_ulong(false_type) const {
344
355
if (__i != __e)
345
356
__throw_overflow_error (" bitset to_ulong overflow error" );
346
357
347
- return __first_[ 0 ] ;
358
+ return to_ulong ( true_type ()) ;
348
359
}
349
360
350
361
template <size_t _N_words, size_t _Size>
351
362
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long
352
363
__bitset<_N_words, _Size>::to_ulong(true_type) const {
353
- return __first_[0 ];
364
+ return to_ulong (true_type (), integral_constant<bool , sizeof (__storage_type) < sizeof (unsigned long )>());
365
+ }
366
+
367
+ template <size_t _N_words, size_t _Size>
368
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long
369
+ __bitset<_N_words, _Size>::to_ulong(true_type, false_type) const {
370
+ return static_cast <unsigned long >(__first_[0 ]);
371
+ }
372
+
373
+ template <size_t _N_words, size_t _Size>
374
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long
375
+ __bitset<_N_words, _Size>::to_ulong(true_type, true_type) const {
376
+ unsigned long __r = __first_[0 ];
377
+ _LIBCPP_DIAGNOSTIC_PUSH
378
+ _LIBCPP_GCC_DIAGNOSTIC_IGNORED (" -Wshift-count-overflow" )
379
+ const size_t __ul_words = sizeof (unsigned long ) / sizeof (__storage_type);
380
+ const size_t __n_words = _N_words < __ul_words ? _N_words : __ul_words;
381
+ for (size_t __i = 1 ; __i < __n_words; ++__i)
382
+ __r |= static_cast <unsigned long >(__first_[__i]) << (__bits_per_word * __i);
383
+ _LIBCPP_DIAGNOSTIC_POP
384
+ return __r;
354
385
}
355
386
356
387
template <size_t _N_words, size_t _Size>
@@ -373,7 +404,7 @@ __bitset<_N_words, _Size>::to_ullong(true_type) const {
373
404
template <size_t _N_words, size_t _Size>
374
405
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long
375
406
__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const {
376
- return __first_[0 ];
407
+ return static_cast < unsigned long long >( __first_[0 ]) ;
377
408
}
378
409
379
410
template <size_t _N_words, size_t _Size>
@@ -383,9 +414,9 @@ __bitset<_N_words, _Size>::to_ullong(true_type, true_type) const {
383
414
_LIBCPP_DIAGNOSTIC_PUSH
384
415
_LIBCPP_GCC_DIAGNOSTIC_IGNORED (" -Wshift-count-overflow" )
385
416
const size_t __ull_words = sizeof (unsigned long long ) / sizeof (__storage_type);
386
- const size_t __n_words = _N_words < __ull_words ? _N_words : __ull_words;
417
+ const size_t __n_words = _N_words < __ull_words ? _N_words : __ull_words;
387
418
for (size_t __i = 1 ; __i < __n_words; ++__i)
388
- __r |= static_cast <unsigned long long >(__first_[__i]) << (sizeof (__storage_type) * CHAR_BIT * __i);
419
+ __r |= static_cast <unsigned long long >(__first_[__i]) << (__bits_per_word * __i);
389
420
_LIBCPP_DIAGNOSTIC_POP
390
421
return __r;
391
422
}
@@ -494,8 +525,7 @@ inline _LIBCPP_CONSTEXPR __bitset<1, _Size>::__bitset() _NOEXCEPT : __first_(0)
494
525
495
526
template <size_t _Size>
496
527
inline _LIBCPP_CONSTEXPR __bitset<1 , _Size>::__bitset(unsigned long long __v) _NOEXCEPT
497
- : __first_(_Size == __bits_per_word ? static_cast <__storage_type>(__v)
498
- : static_cast <__storage_type>(__v) & ((__storage_type(1 ) << _Size) - 1 )) {}
528
+ : __first_(static_cast <__storage_type>(__v)) {}
499
529
500
530
template <size_t _Size>
501
531
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
@@ -524,12 +554,12 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __bitset<1, _Siz
524
554
525
555
template <size_t _Size>
526
556
inline _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long __bitset<1 , _Size>::to_ulong() const {
527
- return __first_;
557
+ return static_cast < unsigned long >( __first_) ;
528
558
}
529
559
530
560
template <size_t _Size>
531
561
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long __bitset<1 , _Size>::to_ullong() const {
532
- return __first_;
562
+ return static_cast < unsigned long long >( __first_) ;
533
563
}
534
564
535
565
template <size_t _Size>
@@ -595,8 +625,8 @@ protected:
595
625
596
626
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void flip () _NOEXCEPT {}
597
627
598
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong () const { return 0 ; }
599
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong () const { return 0 ; }
628
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long to_ulong () const { return 0UL ; }
629
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long to_ullong () const { return 0ULL ; }
600
630
601
631
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool all () const _NOEXCEPT { return true ; }
602
632
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 bool any () const _NOEXCEPT { return false ; }
@@ -626,7 +656,8 @@ public:
626
656
627
657
// 23.3.5.1 constructors:
628
658
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset () _NOEXCEPT {}
629
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset (unsigned long long __v) _NOEXCEPT : __base(__v) {}
659
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bitset (unsigned long long __v) _NOEXCEPT
660
+ : __base(sizeof (unsigned long long ) * CHAR_BIT <= _Size ? __v : __v & ((1ULL << _Size) - 1)) {}
630
661
template <class _CharT , __enable_if_t <_IsCharLikeType<_CharT>::value, int > = 0 >
631
662
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit bitset (
632
663
const _CharT* __str,
0 commit comments