1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP___BIT_REFERENCE 11*4d6fc14bSjoerg#define _LIBCPP___BIT_REFERENCE 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg#include <__config> 14*4d6fc14bSjoerg#include <__bits> 15*4d6fc14bSjoerg#include <algorithm> 16*4d6fc14bSjoerg 17*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18*4d6fc14bSjoerg#pragma GCC system_header 19*4d6fc14bSjoerg#endif 20*4d6fc14bSjoerg 21*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 22*4d6fc14bSjoerg#include <__undef_macros> 23*4d6fc14bSjoerg 24*4d6fc14bSjoerg 25*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 26*4d6fc14bSjoerg 27*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator; 28*4d6fc14bSjoergtemplate <class _Cp> class __bit_const_reference; 29*4d6fc14bSjoerg 30*4d6fc14bSjoergtemplate <class _Tp> 31*4d6fc14bSjoergstruct __has_storage_type 32*4d6fc14bSjoerg{ 33*4d6fc14bSjoerg static const bool value = false; 34*4d6fc14bSjoerg}; 35*4d6fc14bSjoerg 36*4d6fc14bSjoergtemplate <class _Cp, bool = __has_storage_type<_Cp>::value> 37*4d6fc14bSjoergclass __bit_reference 38*4d6fc14bSjoerg{ 39*4d6fc14bSjoerg typedef typename _Cp::__storage_type __storage_type; 40*4d6fc14bSjoerg typedef typename _Cp::__storage_pointer __storage_pointer; 41*4d6fc14bSjoerg 42*4d6fc14bSjoerg __storage_pointer __seg_; 43*4d6fc14bSjoerg __storage_type __mask_; 44*4d6fc14bSjoerg 45*4d6fc14bSjoerg friend typename _Cp::__self; 46*4d6fc14bSjoerg 47*4d6fc14bSjoerg friend class __bit_const_reference<_Cp>; 48*4d6fc14bSjoerg friend class __bit_iterator<_Cp, false>; 49*4d6fc14bSjoergpublic: 50*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 51*4d6fc14bSjoerg __bit_reference(const __bit_reference&) = default; 52*4d6fc14bSjoerg 53*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT 54*4d6fc14bSjoerg {return static_cast<bool>(*__seg_ & __mask_);} 55*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT 56*4d6fc14bSjoerg {return !static_cast<bool>(*this);} 57*4d6fc14bSjoerg 58*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 59*4d6fc14bSjoerg __bit_reference& operator=(bool __x) _NOEXCEPT 60*4d6fc14bSjoerg { 61*4d6fc14bSjoerg if (__x) 62*4d6fc14bSjoerg *__seg_ |= __mask_; 63*4d6fc14bSjoerg else 64*4d6fc14bSjoerg *__seg_ &= ~__mask_; 65*4d6fc14bSjoerg return *this; 66*4d6fc14bSjoerg } 67*4d6fc14bSjoerg 68*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 69*4d6fc14bSjoerg __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT 70*4d6fc14bSjoerg {return operator=(static_cast<bool>(__x));} 71*4d6fc14bSjoerg 72*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;} 73*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT 74*4d6fc14bSjoerg {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));} 75*4d6fc14bSjoergprivate: 76*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 77*4d6fc14bSjoerg __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT 78*4d6fc14bSjoerg : __seg_(__s), __mask_(__m) {} 79*4d6fc14bSjoerg}; 80*4d6fc14bSjoerg 81*4d6fc14bSjoergtemplate <class _Cp> 82*4d6fc14bSjoergclass __bit_reference<_Cp, false> 83*4d6fc14bSjoerg{ 84*4d6fc14bSjoerg}; 85*4d6fc14bSjoerg 86*4d6fc14bSjoergtemplate <class _Cp> 87*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 88*4d6fc14bSjoergvoid 89*4d6fc14bSjoergswap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT 90*4d6fc14bSjoerg{ 91*4d6fc14bSjoerg bool __t = __x; 92*4d6fc14bSjoerg __x = __y; 93*4d6fc14bSjoerg __y = __t; 94*4d6fc14bSjoerg} 95*4d6fc14bSjoerg 96*4d6fc14bSjoergtemplate <class _Cp, class _Dp> 97*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 98*4d6fc14bSjoergvoid 99*4d6fc14bSjoergswap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT 100*4d6fc14bSjoerg{ 101*4d6fc14bSjoerg bool __t = __x; 102*4d6fc14bSjoerg __x = __y; 103*4d6fc14bSjoerg __y = __t; 104*4d6fc14bSjoerg} 105*4d6fc14bSjoerg 106*4d6fc14bSjoergtemplate <class _Cp> 107*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 108*4d6fc14bSjoergvoid 109*4d6fc14bSjoergswap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT 110*4d6fc14bSjoerg{ 111*4d6fc14bSjoerg bool __t = __x; 112*4d6fc14bSjoerg __x = __y; 113*4d6fc14bSjoerg __y = __t; 114*4d6fc14bSjoerg} 115*4d6fc14bSjoerg 116*4d6fc14bSjoergtemplate <class _Cp> 117*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 118*4d6fc14bSjoergvoid 119*4d6fc14bSjoergswap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT 120*4d6fc14bSjoerg{ 121*4d6fc14bSjoerg bool __t = __x; 122*4d6fc14bSjoerg __x = __y; 123*4d6fc14bSjoerg __y = __t; 124*4d6fc14bSjoerg} 125*4d6fc14bSjoerg 126*4d6fc14bSjoergtemplate <class _Cp> 127*4d6fc14bSjoergclass __bit_const_reference 128*4d6fc14bSjoerg{ 129*4d6fc14bSjoerg typedef typename _Cp::__storage_type __storage_type; 130*4d6fc14bSjoerg typedef typename _Cp::__const_storage_pointer __storage_pointer; 131*4d6fc14bSjoerg 132*4d6fc14bSjoerg __storage_pointer __seg_; 133*4d6fc14bSjoerg __storage_type __mask_; 134*4d6fc14bSjoerg 135*4d6fc14bSjoerg friend typename _Cp::__self; 136*4d6fc14bSjoerg friend class __bit_iterator<_Cp, true>; 137*4d6fc14bSjoergpublic: 138*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 139*4d6fc14bSjoerg __bit_const_reference(const __bit_const_reference&) = default; 140*4d6fc14bSjoerg 141*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 142*4d6fc14bSjoerg __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT 143*4d6fc14bSjoerg : __seg_(__x.__seg_), __mask_(__x.__mask_) {} 144*4d6fc14bSjoerg 145*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT 146*4d6fc14bSjoerg {return static_cast<bool>(*__seg_ & __mask_);} 147*4d6fc14bSjoerg 148*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT 149*4d6fc14bSjoerg {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));} 150*4d6fc14bSjoergprivate: 151*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 152*4d6fc14bSjoerg _LIBCPP_CONSTEXPR 153*4d6fc14bSjoerg __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT 154*4d6fc14bSjoerg : __seg_(__s), __mask_(__m) {} 155*4d6fc14bSjoerg 156*4d6fc14bSjoerg __bit_const_reference& operator=(const __bit_const_reference&) = delete; 157*4d6fc14bSjoerg}; 158*4d6fc14bSjoerg 159*4d6fc14bSjoerg// find 160*4d6fc14bSjoerg 161*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 162*4d6fc14bSjoerg__bit_iterator<_Cp, _IsConst> 163*4d6fc14bSjoerg__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) 164*4d6fc14bSjoerg{ 165*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _It; 166*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 167*4d6fc14bSjoerg static const int __bits_per_word = _It::__bits_per_word; 168*4d6fc14bSjoerg // do first partial word 169*4d6fc14bSjoerg if (__first.__ctz_ != 0) 170*4d6fc14bSjoerg { 171*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 172*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 173*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 174*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 175*4d6fc14bSjoerg if (__b) 176*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b))); 177*4d6fc14bSjoerg if (__n == __dn) 178*4d6fc14bSjoerg return __first + __n; 179*4d6fc14bSjoerg __n -= __dn; 180*4d6fc14bSjoerg ++__first.__seg_; 181*4d6fc14bSjoerg } 182*4d6fc14bSjoerg // do middle whole words 183*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) 184*4d6fc14bSjoerg if (*__first.__seg_) 185*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(*__first.__seg_))); 186*4d6fc14bSjoerg // do last partial word 187*4d6fc14bSjoerg if (__n > 0) 188*4d6fc14bSjoerg { 189*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 190*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 191*4d6fc14bSjoerg if (__b) 192*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b))); 193*4d6fc14bSjoerg } 194*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(__n)); 195*4d6fc14bSjoerg} 196*4d6fc14bSjoerg 197*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 198*4d6fc14bSjoerg__bit_iterator<_Cp, _IsConst> 199*4d6fc14bSjoerg__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) 200*4d6fc14bSjoerg{ 201*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _It; 202*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 203*4d6fc14bSjoerg const int __bits_per_word = _It::__bits_per_word; 204*4d6fc14bSjoerg // do first partial word 205*4d6fc14bSjoerg if (__first.__ctz_ != 0) 206*4d6fc14bSjoerg { 207*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 208*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 209*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 210*4d6fc14bSjoerg __storage_type __b = ~*__first.__seg_ & __m; 211*4d6fc14bSjoerg if (__b) 212*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b))); 213*4d6fc14bSjoerg if (__n == __dn) 214*4d6fc14bSjoerg return __first + __n; 215*4d6fc14bSjoerg __n -= __dn; 216*4d6fc14bSjoerg ++__first.__seg_; 217*4d6fc14bSjoerg } 218*4d6fc14bSjoerg // do middle whole words 219*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) 220*4d6fc14bSjoerg { 221*4d6fc14bSjoerg __storage_type __b = ~*__first.__seg_; 222*4d6fc14bSjoerg if (__b) 223*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b))); 224*4d6fc14bSjoerg } 225*4d6fc14bSjoerg // do last partial word 226*4d6fc14bSjoerg if (__n > 0) 227*4d6fc14bSjoerg { 228*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 229*4d6fc14bSjoerg __storage_type __b = ~*__first.__seg_ & __m; 230*4d6fc14bSjoerg if (__b) 231*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b))); 232*4d6fc14bSjoerg } 233*4d6fc14bSjoerg return _It(__first.__seg_, static_cast<unsigned>(__n)); 234*4d6fc14bSjoerg} 235*4d6fc14bSjoerg 236*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst, class _Tp> 237*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 238*4d6fc14bSjoerg__bit_iterator<_Cp, _IsConst> 239*4d6fc14bSjoergfind(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_) 240*4d6fc14bSjoerg{ 241*4d6fc14bSjoerg if (static_cast<bool>(__value_)) 242*4d6fc14bSjoerg return _VSTD::__find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first)); 243*4d6fc14bSjoerg return _VSTD::__find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first)); 244*4d6fc14bSjoerg} 245*4d6fc14bSjoerg 246*4d6fc14bSjoerg// count 247*4d6fc14bSjoerg 248*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 249*4d6fc14bSjoergtypename __bit_iterator<_Cp, _IsConst>::difference_type 250*4d6fc14bSjoerg__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) 251*4d6fc14bSjoerg{ 252*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _It; 253*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 254*4d6fc14bSjoerg typedef typename _It::difference_type difference_type; 255*4d6fc14bSjoerg const int __bits_per_word = _It::__bits_per_word; 256*4d6fc14bSjoerg difference_type __r = 0; 257*4d6fc14bSjoerg // do first partial word 258*4d6fc14bSjoerg if (__first.__ctz_ != 0) 259*4d6fc14bSjoerg { 260*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 261*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 262*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 263*4d6fc14bSjoerg __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m); 264*4d6fc14bSjoerg __n -= __dn; 265*4d6fc14bSjoerg ++__first.__seg_; 266*4d6fc14bSjoerg } 267*4d6fc14bSjoerg // do middle whole words 268*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) 269*4d6fc14bSjoerg __r += _VSTD::__libcpp_popcount(*__first.__seg_); 270*4d6fc14bSjoerg // do last partial word 271*4d6fc14bSjoerg if (__n > 0) 272*4d6fc14bSjoerg { 273*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 274*4d6fc14bSjoerg __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m); 275*4d6fc14bSjoerg } 276*4d6fc14bSjoerg return __r; 277*4d6fc14bSjoerg} 278*4d6fc14bSjoerg 279*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 280*4d6fc14bSjoergtypename __bit_iterator<_Cp, _IsConst>::difference_type 281*4d6fc14bSjoerg__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) 282*4d6fc14bSjoerg{ 283*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _It; 284*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 285*4d6fc14bSjoerg typedef typename _It::difference_type difference_type; 286*4d6fc14bSjoerg const int __bits_per_word = _It::__bits_per_word; 287*4d6fc14bSjoerg difference_type __r = 0; 288*4d6fc14bSjoerg // do first partial word 289*4d6fc14bSjoerg if (__first.__ctz_ != 0) 290*4d6fc14bSjoerg { 291*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 292*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 293*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 294*4d6fc14bSjoerg __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); 295*4d6fc14bSjoerg __n -= __dn; 296*4d6fc14bSjoerg ++__first.__seg_; 297*4d6fc14bSjoerg } 298*4d6fc14bSjoerg // do middle whole words 299*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) 300*4d6fc14bSjoerg __r += _VSTD::__libcpp_popcount(~*__first.__seg_); 301*4d6fc14bSjoerg // do last partial word 302*4d6fc14bSjoerg if (__n > 0) 303*4d6fc14bSjoerg { 304*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 305*4d6fc14bSjoerg __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); 306*4d6fc14bSjoerg } 307*4d6fc14bSjoerg return __r; 308*4d6fc14bSjoerg} 309*4d6fc14bSjoerg 310*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst, class _Tp> 311*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 312*4d6fc14bSjoergtypename __bit_iterator<_Cp, _IsConst>::difference_type 313*4d6fc14bSjoergcount(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_) 314*4d6fc14bSjoerg{ 315*4d6fc14bSjoerg if (static_cast<bool>(__value_)) 316*4d6fc14bSjoerg return _VSTD::__count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first)); 317*4d6fc14bSjoerg return _VSTD::__count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first)); 318*4d6fc14bSjoerg} 319*4d6fc14bSjoerg 320*4d6fc14bSjoerg// fill_n 321*4d6fc14bSjoerg 322*4d6fc14bSjoergtemplate <class _Cp> 323*4d6fc14bSjoergvoid 324*4d6fc14bSjoerg__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) 325*4d6fc14bSjoerg{ 326*4d6fc14bSjoerg typedef __bit_iterator<_Cp, false> _It; 327*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 328*4d6fc14bSjoerg const int __bits_per_word = _It::__bits_per_word; 329*4d6fc14bSjoerg // do first partial word 330*4d6fc14bSjoerg if (__first.__ctz_ != 0) 331*4d6fc14bSjoerg { 332*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 333*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 334*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 335*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 336*4d6fc14bSjoerg __n -= __dn; 337*4d6fc14bSjoerg ++__first.__seg_; 338*4d6fc14bSjoerg } 339*4d6fc14bSjoerg // do middle whole words 340*4d6fc14bSjoerg __storage_type __nw = __n / __bits_per_word; 341*4d6fc14bSjoerg _VSTD::memset(_VSTD::__to_address(__first.__seg_), 0, __nw * sizeof(__storage_type)); 342*4d6fc14bSjoerg __n -= __nw * __bits_per_word; 343*4d6fc14bSjoerg // do last partial word 344*4d6fc14bSjoerg if (__n > 0) 345*4d6fc14bSjoerg { 346*4d6fc14bSjoerg __first.__seg_ += __nw; 347*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 348*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 349*4d6fc14bSjoerg } 350*4d6fc14bSjoerg} 351*4d6fc14bSjoerg 352*4d6fc14bSjoergtemplate <class _Cp> 353*4d6fc14bSjoergvoid 354*4d6fc14bSjoerg__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) 355*4d6fc14bSjoerg{ 356*4d6fc14bSjoerg typedef __bit_iterator<_Cp, false> _It; 357*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 358*4d6fc14bSjoerg const int __bits_per_word = _It::__bits_per_word; 359*4d6fc14bSjoerg // do first partial word 360*4d6fc14bSjoerg if (__first.__ctz_ != 0) 361*4d6fc14bSjoerg { 362*4d6fc14bSjoerg __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); 363*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__clz_f, __n); 364*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 365*4d6fc14bSjoerg *__first.__seg_ |= __m; 366*4d6fc14bSjoerg __n -= __dn; 367*4d6fc14bSjoerg ++__first.__seg_; 368*4d6fc14bSjoerg } 369*4d6fc14bSjoerg // do middle whole words 370*4d6fc14bSjoerg __storage_type __nw = __n / __bits_per_word; 371*4d6fc14bSjoerg _VSTD::memset(_VSTD::__to_address(__first.__seg_), -1, __nw * sizeof(__storage_type)); 372*4d6fc14bSjoerg __n -= __nw * __bits_per_word; 373*4d6fc14bSjoerg // do last partial word 374*4d6fc14bSjoerg if (__n > 0) 375*4d6fc14bSjoerg { 376*4d6fc14bSjoerg __first.__seg_ += __nw; 377*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 378*4d6fc14bSjoerg *__first.__seg_ |= __m; 379*4d6fc14bSjoerg } 380*4d6fc14bSjoerg} 381*4d6fc14bSjoerg 382*4d6fc14bSjoergtemplate <class _Cp> 383*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 384*4d6fc14bSjoergvoid 385*4d6fc14bSjoergfill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_) 386*4d6fc14bSjoerg{ 387*4d6fc14bSjoerg if (__n > 0) 388*4d6fc14bSjoerg { 389*4d6fc14bSjoerg if (__value_) 390*4d6fc14bSjoerg _VSTD::__fill_n_true(__first, __n); 391*4d6fc14bSjoerg else 392*4d6fc14bSjoerg _VSTD::__fill_n_false(__first, __n); 393*4d6fc14bSjoerg } 394*4d6fc14bSjoerg} 395*4d6fc14bSjoerg 396*4d6fc14bSjoerg// fill 397*4d6fc14bSjoerg 398*4d6fc14bSjoergtemplate <class _Cp> 399*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 400*4d6fc14bSjoergvoid 401*4d6fc14bSjoergfill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_) 402*4d6fc14bSjoerg{ 403*4d6fc14bSjoerg _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_); 404*4d6fc14bSjoerg} 405*4d6fc14bSjoerg 406*4d6fc14bSjoerg// copy 407*4d6fc14bSjoerg 408*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 409*4d6fc14bSjoerg__bit_iterator<_Cp, false> 410*4d6fc14bSjoerg__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, 411*4d6fc14bSjoerg __bit_iterator<_Cp, false> __result) 412*4d6fc14bSjoerg{ 413*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _In; 414*4d6fc14bSjoerg typedef typename _In::difference_type difference_type; 415*4d6fc14bSjoerg typedef typename _In::__storage_type __storage_type; 416*4d6fc14bSjoerg const int __bits_per_word = _In::__bits_per_word; 417*4d6fc14bSjoerg difference_type __n = __last - __first; 418*4d6fc14bSjoerg if (__n > 0) 419*4d6fc14bSjoerg { 420*4d6fc14bSjoerg // do first word 421*4d6fc14bSjoerg if (__first.__ctz_ != 0) 422*4d6fc14bSjoerg { 423*4d6fc14bSjoerg unsigned __clz = __bits_per_word - __first.__ctz_; 424*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); 425*4d6fc14bSjoerg __n -= __dn; 426*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); 427*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 428*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 429*4d6fc14bSjoerg *__result.__seg_ |= __b; 430*4d6fc14bSjoerg __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; 431*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); 432*4d6fc14bSjoerg ++__first.__seg_; 433*4d6fc14bSjoerg // __first.__ctz_ = 0; 434*4d6fc14bSjoerg } 435*4d6fc14bSjoerg // __first.__ctz_ == 0; 436*4d6fc14bSjoerg // do middle words 437*4d6fc14bSjoerg __storage_type __nw = __n / __bits_per_word; 438*4d6fc14bSjoerg _VSTD::memmove(_VSTD::__to_address(__result.__seg_), 439*4d6fc14bSjoerg _VSTD::__to_address(__first.__seg_), 440*4d6fc14bSjoerg __nw * sizeof(__storage_type)); 441*4d6fc14bSjoerg __n -= __nw * __bits_per_word; 442*4d6fc14bSjoerg __result.__seg_ += __nw; 443*4d6fc14bSjoerg // do last word 444*4d6fc14bSjoerg if (__n > 0) 445*4d6fc14bSjoerg { 446*4d6fc14bSjoerg __first.__seg_ += __nw; 447*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 448*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 449*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 450*4d6fc14bSjoerg *__result.__seg_ |= __b; 451*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__n); 452*4d6fc14bSjoerg } 453*4d6fc14bSjoerg } 454*4d6fc14bSjoerg return __result; 455*4d6fc14bSjoerg} 456*4d6fc14bSjoerg 457*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 458*4d6fc14bSjoerg__bit_iterator<_Cp, false> 459*4d6fc14bSjoerg__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, 460*4d6fc14bSjoerg __bit_iterator<_Cp, false> __result) 461*4d6fc14bSjoerg{ 462*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _In; 463*4d6fc14bSjoerg typedef typename _In::difference_type difference_type; 464*4d6fc14bSjoerg typedef typename _In::__storage_type __storage_type; 465*4d6fc14bSjoerg static const int __bits_per_word = _In::__bits_per_word; 466*4d6fc14bSjoerg difference_type __n = __last - __first; 467*4d6fc14bSjoerg if (__n > 0) 468*4d6fc14bSjoerg { 469*4d6fc14bSjoerg // do first word 470*4d6fc14bSjoerg if (__first.__ctz_ != 0) 471*4d6fc14bSjoerg { 472*4d6fc14bSjoerg unsigned __clz_f = __bits_per_word - __first.__ctz_; 473*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); 474*4d6fc14bSjoerg __n -= __dn; 475*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 476*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 477*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 478*4d6fc14bSjoerg __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); 479*4d6fc14bSjoerg __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); 480*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 481*4d6fc14bSjoerg if (__result.__ctz_ > __first.__ctz_) 482*4d6fc14bSjoerg *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_); 483*4d6fc14bSjoerg else 484*4d6fc14bSjoerg *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_); 485*4d6fc14bSjoerg __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; 486*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word); 487*4d6fc14bSjoerg __dn -= __ddn; 488*4d6fc14bSjoerg if (__dn > 0) 489*4d6fc14bSjoerg { 490*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __dn); 491*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 492*4d6fc14bSjoerg *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn); 493*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__dn); 494*4d6fc14bSjoerg } 495*4d6fc14bSjoerg ++__first.__seg_; 496*4d6fc14bSjoerg // __first.__ctz_ = 0; 497*4d6fc14bSjoerg } 498*4d6fc14bSjoerg // __first.__ctz_ == 0; 499*4d6fc14bSjoerg // do middle words 500*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 501*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) << __result.__ctz_; 502*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) 503*4d6fc14bSjoerg { 504*4d6fc14bSjoerg __storage_type __b = *__first.__seg_; 505*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 506*4d6fc14bSjoerg *__result.__seg_ |= __b << __result.__ctz_; 507*4d6fc14bSjoerg ++__result.__seg_; 508*4d6fc14bSjoerg *__result.__seg_ &= __m; 509*4d6fc14bSjoerg *__result.__seg_ |= __b >> __clz_r; 510*4d6fc14bSjoerg } 511*4d6fc14bSjoerg // do last word 512*4d6fc14bSjoerg if (__n > 0) 513*4d6fc14bSjoerg { 514*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 515*4d6fc14bSjoerg __storage_type __b = *__first.__seg_ & __m; 516*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r)); 517*4d6fc14bSjoerg __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); 518*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 519*4d6fc14bSjoerg *__result.__seg_ |= __b << __result.__ctz_; 520*4d6fc14bSjoerg __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; 521*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); 522*4d6fc14bSjoerg __n -= __dn; 523*4d6fc14bSjoerg if (__n > 0) 524*4d6fc14bSjoerg { 525*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 526*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 527*4d6fc14bSjoerg *__result.__seg_ |= __b >> __dn; 528*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__n); 529*4d6fc14bSjoerg } 530*4d6fc14bSjoerg } 531*4d6fc14bSjoerg } 532*4d6fc14bSjoerg return __result; 533*4d6fc14bSjoerg} 534*4d6fc14bSjoerg 535*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 536*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 537*4d6fc14bSjoerg__bit_iterator<_Cp, false> 538*4d6fc14bSjoergcopy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) 539*4d6fc14bSjoerg{ 540*4d6fc14bSjoerg if (__first.__ctz_ == __result.__ctz_) 541*4d6fc14bSjoerg return _VSTD::__copy_aligned(__first, __last, __result); 542*4d6fc14bSjoerg return _VSTD::__copy_unaligned(__first, __last, __result); 543*4d6fc14bSjoerg} 544*4d6fc14bSjoerg 545*4d6fc14bSjoerg// copy_backward 546*4d6fc14bSjoerg 547*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 548*4d6fc14bSjoerg__bit_iterator<_Cp, false> 549*4d6fc14bSjoerg__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, 550*4d6fc14bSjoerg __bit_iterator<_Cp, false> __result) 551*4d6fc14bSjoerg{ 552*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _In; 553*4d6fc14bSjoerg typedef typename _In::difference_type difference_type; 554*4d6fc14bSjoerg typedef typename _In::__storage_type __storage_type; 555*4d6fc14bSjoerg const int __bits_per_word = _In::__bits_per_word; 556*4d6fc14bSjoerg difference_type __n = __last - __first; 557*4d6fc14bSjoerg if (__n > 0) 558*4d6fc14bSjoerg { 559*4d6fc14bSjoerg // do first word 560*4d6fc14bSjoerg if (__last.__ctz_ != 0) 561*4d6fc14bSjoerg { 562*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n); 563*4d6fc14bSjoerg __n -= __dn; 564*4d6fc14bSjoerg unsigned __clz = __bits_per_word - __last.__ctz_; 565*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz); 566*4d6fc14bSjoerg __storage_type __b = *__last.__seg_ & __m; 567*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 568*4d6fc14bSjoerg *__result.__seg_ |= __b; 569*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + 570*4d6fc14bSjoerg __result.__ctz_) % __bits_per_word); 571*4d6fc14bSjoerg // __last.__ctz_ = 0 572*4d6fc14bSjoerg } 573*4d6fc14bSjoerg // __last.__ctz_ == 0 || __n == 0 574*4d6fc14bSjoerg // __result.__ctz_ == 0 || __n == 0 575*4d6fc14bSjoerg // do middle words 576*4d6fc14bSjoerg __storage_type __nw = __n / __bits_per_word; 577*4d6fc14bSjoerg __result.__seg_ -= __nw; 578*4d6fc14bSjoerg __last.__seg_ -= __nw; 579*4d6fc14bSjoerg _VSTD::memmove(_VSTD::__to_address(__result.__seg_), 580*4d6fc14bSjoerg _VSTD::__to_address(__last.__seg_), 581*4d6fc14bSjoerg __nw * sizeof(__storage_type)); 582*4d6fc14bSjoerg __n -= __nw * __bits_per_word; 583*4d6fc14bSjoerg // do last word 584*4d6fc14bSjoerg if (__n > 0) 585*4d6fc14bSjoerg { 586*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n); 587*4d6fc14bSjoerg __storage_type __b = *--__last.__seg_ & __m; 588*4d6fc14bSjoerg *--__result.__seg_ &= ~__m; 589*4d6fc14bSjoerg *__result.__seg_ |= __b; 590*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1)); 591*4d6fc14bSjoerg } 592*4d6fc14bSjoerg } 593*4d6fc14bSjoerg return __result; 594*4d6fc14bSjoerg} 595*4d6fc14bSjoerg 596*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 597*4d6fc14bSjoerg__bit_iterator<_Cp, false> 598*4d6fc14bSjoerg__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, 599*4d6fc14bSjoerg __bit_iterator<_Cp, false> __result) 600*4d6fc14bSjoerg{ 601*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IsConst> _In; 602*4d6fc14bSjoerg typedef typename _In::difference_type difference_type; 603*4d6fc14bSjoerg typedef typename _In::__storage_type __storage_type; 604*4d6fc14bSjoerg const int __bits_per_word = _In::__bits_per_word; 605*4d6fc14bSjoerg difference_type __n = __last - __first; 606*4d6fc14bSjoerg if (__n > 0) 607*4d6fc14bSjoerg { 608*4d6fc14bSjoerg // do first word 609*4d6fc14bSjoerg if (__last.__ctz_ != 0) 610*4d6fc14bSjoerg { 611*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n); 612*4d6fc14bSjoerg __n -= __dn; 613*4d6fc14bSjoerg unsigned __clz_l = __bits_per_word - __last.__ctz_; 614*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l); 615*4d6fc14bSjoerg __storage_type __b = *__last.__seg_ & __m; 616*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 617*4d6fc14bSjoerg __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_)); 618*4d6fc14bSjoerg if (__ddn > 0) 619*4d6fc14bSjoerg { 620*4d6fc14bSjoerg __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r); 621*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 622*4d6fc14bSjoerg if (__result.__ctz_ > __last.__ctz_) 623*4d6fc14bSjoerg *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); 624*4d6fc14bSjoerg else 625*4d6fc14bSjoerg *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_); 626*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) + 627*4d6fc14bSjoerg __result.__ctz_) % __bits_per_word); 628*4d6fc14bSjoerg __dn -= __ddn; 629*4d6fc14bSjoerg } 630*4d6fc14bSjoerg if (__dn > 0) 631*4d6fc14bSjoerg { 632*4d6fc14bSjoerg // __result.__ctz_ == 0 633*4d6fc14bSjoerg --__result.__seg_; 634*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1)); 635*4d6fc14bSjoerg __m = ~__storage_type(0) << __result.__ctz_; 636*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 637*4d6fc14bSjoerg __last.__ctz_ -= __dn + __ddn; 638*4d6fc14bSjoerg *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); 639*4d6fc14bSjoerg } 640*4d6fc14bSjoerg // __last.__ctz_ = 0 641*4d6fc14bSjoerg } 642*4d6fc14bSjoerg // __last.__ctz_ == 0 || __n == 0 643*4d6fc14bSjoerg // __result.__ctz_ != 0 || __n == 0 644*4d6fc14bSjoerg // do middle words 645*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 646*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> __clz_r; 647*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word) 648*4d6fc14bSjoerg { 649*4d6fc14bSjoerg __storage_type __b = *--__last.__seg_; 650*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 651*4d6fc14bSjoerg *__result.__seg_ |= __b >> __clz_r; 652*4d6fc14bSjoerg *--__result.__seg_ &= __m; 653*4d6fc14bSjoerg *__result.__seg_ |= __b << __result.__ctz_; 654*4d6fc14bSjoerg } 655*4d6fc14bSjoerg // do last word 656*4d6fc14bSjoerg if (__n > 0) 657*4d6fc14bSjoerg { 658*4d6fc14bSjoerg __m = ~__storage_type(0) << (__bits_per_word - __n); 659*4d6fc14bSjoerg __storage_type __b = *--__last.__seg_ & __m; 660*4d6fc14bSjoerg __clz_r = __bits_per_word - __result.__ctz_; 661*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_)); 662*4d6fc14bSjoerg __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r); 663*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 664*4d6fc14bSjoerg *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_); 665*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + 666*4d6fc14bSjoerg __result.__ctz_) % __bits_per_word); 667*4d6fc14bSjoerg __n -= __dn; 668*4d6fc14bSjoerg if (__n > 0) 669*4d6fc14bSjoerg { 670*4d6fc14bSjoerg // __result.__ctz_ == 0 671*4d6fc14bSjoerg --__result.__seg_; 672*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1)); 673*4d6fc14bSjoerg __m = ~__storage_type(0) << __result.__ctz_; 674*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 675*4d6fc14bSjoerg *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn)); 676*4d6fc14bSjoerg } 677*4d6fc14bSjoerg } 678*4d6fc14bSjoerg } 679*4d6fc14bSjoerg return __result; 680*4d6fc14bSjoerg} 681*4d6fc14bSjoerg 682*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 683*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 684*4d6fc14bSjoerg__bit_iterator<_Cp, false> 685*4d6fc14bSjoergcopy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) 686*4d6fc14bSjoerg{ 687*4d6fc14bSjoerg if (__last.__ctz_ == __result.__ctz_) 688*4d6fc14bSjoerg return _VSTD::__copy_backward_aligned(__first, __last, __result); 689*4d6fc14bSjoerg return _VSTD::__copy_backward_unaligned(__first, __last, __result); 690*4d6fc14bSjoerg} 691*4d6fc14bSjoerg 692*4d6fc14bSjoerg// move 693*4d6fc14bSjoerg 694*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 695*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 696*4d6fc14bSjoerg__bit_iterator<_Cp, false> 697*4d6fc14bSjoergmove(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) 698*4d6fc14bSjoerg{ 699*4d6fc14bSjoerg return _VSTD::copy(__first, __last, __result); 700*4d6fc14bSjoerg} 701*4d6fc14bSjoerg 702*4d6fc14bSjoerg// move_backward 703*4d6fc14bSjoerg 704*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst> 705*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 706*4d6fc14bSjoerg__bit_iterator<_Cp, false> 707*4d6fc14bSjoergmove_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) 708*4d6fc14bSjoerg{ 709*4d6fc14bSjoerg return _VSTD::copy_backward(__first, __last, __result); 710*4d6fc14bSjoerg} 711*4d6fc14bSjoerg 712*4d6fc14bSjoerg// swap_ranges 713*4d6fc14bSjoerg 714*4d6fc14bSjoergtemplate <class __C1, class __C2> 715*4d6fc14bSjoerg__bit_iterator<__C2, false> 716*4d6fc14bSjoerg__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, 717*4d6fc14bSjoerg __bit_iterator<__C2, false> __result) 718*4d6fc14bSjoerg{ 719*4d6fc14bSjoerg typedef __bit_iterator<__C1, false> _I1; 720*4d6fc14bSjoerg typedef typename _I1::difference_type difference_type; 721*4d6fc14bSjoerg typedef typename _I1::__storage_type __storage_type; 722*4d6fc14bSjoerg const int __bits_per_word = _I1::__bits_per_word; 723*4d6fc14bSjoerg difference_type __n = __last - __first; 724*4d6fc14bSjoerg if (__n > 0) 725*4d6fc14bSjoerg { 726*4d6fc14bSjoerg // do first word 727*4d6fc14bSjoerg if (__first.__ctz_ != 0) 728*4d6fc14bSjoerg { 729*4d6fc14bSjoerg unsigned __clz = __bits_per_word - __first.__ctz_; 730*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); 731*4d6fc14bSjoerg __n -= __dn; 732*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); 733*4d6fc14bSjoerg __storage_type __b1 = *__first.__seg_ & __m; 734*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 735*4d6fc14bSjoerg __storage_type __b2 = *__result.__seg_ & __m; 736*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 737*4d6fc14bSjoerg *__result.__seg_ |= __b1; 738*4d6fc14bSjoerg *__first.__seg_ |= __b2; 739*4d6fc14bSjoerg __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; 740*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); 741*4d6fc14bSjoerg ++__first.__seg_; 742*4d6fc14bSjoerg // __first.__ctz_ = 0; 743*4d6fc14bSjoerg } 744*4d6fc14bSjoerg // __first.__ctz_ == 0; 745*4d6fc14bSjoerg // do middle words 746*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_) 747*4d6fc14bSjoerg swap(*__first.__seg_, *__result.__seg_); 748*4d6fc14bSjoerg // do last word 749*4d6fc14bSjoerg if (__n > 0) 750*4d6fc14bSjoerg { 751*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 752*4d6fc14bSjoerg __storage_type __b1 = *__first.__seg_ & __m; 753*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 754*4d6fc14bSjoerg __storage_type __b2 = *__result.__seg_ & __m; 755*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 756*4d6fc14bSjoerg *__result.__seg_ |= __b1; 757*4d6fc14bSjoerg *__first.__seg_ |= __b2; 758*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__n); 759*4d6fc14bSjoerg } 760*4d6fc14bSjoerg } 761*4d6fc14bSjoerg return __result; 762*4d6fc14bSjoerg} 763*4d6fc14bSjoerg 764*4d6fc14bSjoergtemplate <class __C1, class __C2> 765*4d6fc14bSjoerg__bit_iterator<__C2, false> 766*4d6fc14bSjoerg__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, 767*4d6fc14bSjoerg __bit_iterator<__C2, false> __result) 768*4d6fc14bSjoerg{ 769*4d6fc14bSjoerg typedef __bit_iterator<__C1, false> _I1; 770*4d6fc14bSjoerg typedef typename _I1::difference_type difference_type; 771*4d6fc14bSjoerg typedef typename _I1::__storage_type __storage_type; 772*4d6fc14bSjoerg const int __bits_per_word = _I1::__bits_per_word; 773*4d6fc14bSjoerg difference_type __n = __last - __first; 774*4d6fc14bSjoerg if (__n > 0) 775*4d6fc14bSjoerg { 776*4d6fc14bSjoerg // do first word 777*4d6fc14bSjoerg if (__first.__ctz_ != 0) 778*4d6fc14bSjoerg { 779*4d6fc14bSjoerg unsigned __clz_f = __bits_per_word - __first.__ctz_; 780*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); 781*4d6fc14bSjoerg __n -= __dn; 782*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 783*4d6fc14bSjoerg __storage_type __b1 = *__first.__seg_ & __m; 784*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 785*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 786*4d6fc14bSjoerg __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); 787*4d6fc14bSjoerg __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); 788*4d6fc14bSjoerg __storage_type __b2 = *__result.__seg_ & __m; 789*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 790*4d6fc14bSjoerg if (__result.__ctz_ > __first.__ctz_) 791*4d6fc14bSjoerg { 792*4d6fc14bSjoerg unsigned __s = __result.__ctz_ - __first.__ctz_; 793*4d6fc14bSjoerg *__result.__seg_ |= __b1 << __s; 794*4d6fc14bSjoerg *__first.__seg_ |= __b2 >> __s; 795*4d6fc14bSjoerg } 796*4d6fc14bSjoerg else 797*4d6fc14bSjoerg { 798*4d6fc14bSjoerg unsigned __s = __first.__ctz_ - __result.__ctz_; 799*4d6fc14bSjoerg *__result.__seg_ |= __b1 >> __s; 800*4d6fc14bSjoerg *__first.__seg_ |= __b2 << __s; 801*4d6fc14bSjoerg } 802*4d6fc14bSjoerg __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; 803*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word); 804*4d6fc14bSjoerg __dn -= __ddn; 805*4d6fc14bSjoerg if (__dn > 0) 806*4d6fc14bSjoerg { 807*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __dn); 808*4d6fc14bSjoerg __b2 = *__result.__seg_ & __m; 809*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 810*4d6fc14bSjoerg unsigned __s = __first.__ctz_ + __ddn; 811*4d6fc14bSjoerg *__result.__seg_ |= __b1 >> __s; 812*4d6fc14bSjoerg *__first.__seg_ |= __b2 << __s; 813*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__dn); 814*4d6fc14bSjoerg } 815*4d6fc14bSjoerg ++__first.__seg_; 816*4d6fc14bSjoerg // __first.__ctz_ = 0; 817*4d6fc14bSjoerg } 818*4d6fc14bSjoerg // __first.__ctz_ == 0; 819*4d6fc14bSjoerg // do middle words 820*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) << __result.__ctz_; 821*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __result.__ctz_; 822*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) 823*4d6fc14bSjoerg { 824*4d6fc14bSjoerg __storage_type __b1 = *__first.__seg_; 825*4d6fc14bSjoerg __storage_type __b2 = *__result.__seg_ & __m; 826*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 827*4d6fc14bSjoerg *__result.__seg_ |= __b1 << __result.__ctz_; 828*4d6fc14bSjoerg *__first.__seg_ = __b2 >> __result.__ctz_; 829*4d6fc14bSjoerg ++__result.__seg_; 830*4d6fc14bSjoerg __b2 = *__result.__seg_ & ~__m; 831*4d6fc14bSjoerg *__result.__seg_ &= __m; 832*4d6fc14bSjoerg *__result.__seg_ |= __b1 >> __clz_r; 833*4d6fc14bSjoerg *__first.__seg_ |= __b2 << __clz_r; 834*4d6fc14bSjoerg } 835*4d6fc14bSjoerg // do last word 836*4d6fc14bSjoerg if (__n > 0) 837*4d6fc14bSjoerg { 838*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 839*4d6fc14bSjoerg __storage_type __b1 = *__first.__seg_ & __m; 840*4d6fc14bSjoerg *__first.__seg_ &= ~__m; 841*4d6fc14bSjoerg __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r); 842*4d6fc14bSjoerg __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); 843*4d6fc14bSjoerg __storage_type __b2 = *__result.__seg_ & __m; 844*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 845*4d6fc14bSjoerg *__result.__seg_ |= __b1 << __result.__ctz_; 846*4d6fc14bSjoerg *__first.__seg_ |= __b2 >> __result.__ctz_; 847*4d6fc14bSjoerg __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; 848*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); 849*4d6fc14bSjoerg __n -= __dn; 850*4d6fc14bSjoerg if (__n > 0) 851*4d6fc14bSjoerg { 852*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 853*4d6fc14bSjoerg __b2 = *__result.__seg_ & __m; 854*4d6fc14bSjoerg *__result.__seg_ &= ~__m; 855*4d6fc14bSjoerg *__result.__seg_ |= __b1 >> __dn; 856*4d6fc14bSjoerg *__first.__seg_ |= __b2 << __dn; 857*4d6fc14bSjoerg __result.__ctz_ = static_cast<unsigned>(__n); 858*4d6fc14bSjoerg } 859*4d6fc14bSjoerg } 860*4d6fc14bSjoerg } 861*4d6fc14bSjoerg return __result; 862*4d6fc14bSjoerg} 863*4d6fc14bSjoerg 864*4d6fc14bSjoergtemplate <class __C1, class __C2> 865*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 866*4d6fc14bSjoerg__bit_iterator<__C2, false> 867*4d6fc14bSjoergswap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1, 868*4d6fc14bSjoerg __bit_iterator<__C2, false> __first2) 869*4d6fc14bSjoerg{ 870*4d6fc14bSjoerg if (__first1.__ctz_ == __first2.__ctz_) 871*4d6fc14bSjoerg return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2); 872*4d6fc14bSjoerg return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2); 873*4d6fc14bSjoerg} 874*4d6fc14bSjoerg 875*4d6fc14bSjoerg// rotate 876*4d6fc14bSjoerg 877*4d6fc14bSjoergtemplate <class _Cp> 878*4d6fc14bSjoergstruct __bit_array 879*4d6fc14bSjoerg{ 880*4d6fc14bSjoerg typedef typename _Cp::difference_type difference_type; 881*4d6fc14bSjoerg typedef typename _Cp::__storage_type __storage_type; 882*4d6fc14bSjoerg typedef typename _Cp::__storage_pointer __storage_pointer; 883*4d6fc14bSjoerg typedef typename _Cp::iterator iterator; 884*4d6fc14bSjoerg static const unsigned __bits_per_word = _Cp::__bits_per_word; 885*4d6fc14bSjoerg static const unsigned _Np = 4; 886*4d6fc14bSjoerg 887*4d6fc14bSjoerg difference_type __size_; 888*4d6fc14bSjoerg __storage_type __word_[_Np]; 889*4d6fc14bSjoerg 890*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY static difference_type capacity() 891*4d6fc14bSjoerg {return static_cast<difference_type>(_Np * __bits_per_word);} 892*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {} 893*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator begin() 894*4d6fc14bSjoerg { 895*4d6fc14bSjoerg return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0); 896*4d6fc14bSjoerg } 897*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator end() 898*4d6fc14bSjoerg { 899*4d6fc14bSjoerg return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word, 900*4d6fc14bSjoerg static_cast<unsigned>(__size_ % __bits_per_word)); 901*4d6fc14bSjoerg } 902*4d6fc14bSjoerg}; 903*4d6fc14bSjoerg 904*4d6fc14bSjoergtemplate <class _Cp> 905*4d6fc14bSjoerg__bit_iterator<_Cp, false> 906*4d6fc14bSjoergrotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last) 907*4d6fc14bSjoerg{ 908*4d6fc14bSjoerg typedef __bit_iterator<_Cp, false> _I1; 909*4d6fc14bSjoerg typedef typename _I1::difference_type difference_type; 910*4d6fc14bSjoerg difference_type __d1 = __middle - __first; 911*4d6fc14bSjoerg difference_type __d2 = __last - __middle; 912*4d6fc14bSjoerg _I1 __r = __first + __d2; 913*4d6fc14bSjoerg while (__d1 != 0 && __d2 != 0) 914*4d6fc14bSjoerg { 915*4d6fc14bSjoerg if (__d1 <= __d2) 916*4d6fc14bSjoerg { 917*4d6fc14bSjoerg if (__d1 <= __bit_array<_Cp>::capacity()) 918*4d6fc14bSjoerg { 919*4d6fc14bSjoerg __bit_array<_Cp> __b(__d1); 920*4d6fc14bSjoerg _VSTD::copy(__first, __middle, __b.begin()); 921*4d6fc14bSjoerg _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first)); 922*4d6fc14bSjoerg break; 923*4d6fc14bSjoerg } 924*4d6fc14bSjoerg else 925*4d6fc14bSjoerg { 926*4d6fc14bSjoerg __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle); 927*4d6fc14bSjoerg __first = __middle; 928*4d6fc14bSjoerg __middle = __mp; 929*4d6fc14bSjoerg __d2 -= __d1; 930*4d6fc14bSjoerg } 931*4d6fc14bSjoerg } 932*4d6fc14bSjoerg else 933*4d6fc14bSjoerg { 934*4d6fc14bSjoerg if (__d2 <= __bit_array<_Cp>::capacity()) 935*4d6fc14bSjoerg { 936*4d6fc14bSjoerg __bit_array<_Cp> __b(__d2); 937*4d6fc14bSjoerg _VSTD::copy(__middle, __last, __b.begin()); 938*4d6fc14bSjoerg _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last)); 939*4d6fc14bSjoerg break; 940*4d6fc14bSjoerg } 941*4d6fc14bSjoerg else 942*4d6fc14bSjoerg { 943*4d6fc14bSjoerg __bit_iterator<_Cp, false> __mp = __first + __d2; 944*4d6fc14bSjoerg _VSTD::swap_ranges(__first, __mp, __middle); 945*4d6fc14bSjoerg __first = __mp; 946*4d6fc14bSjoerg __d1 -= __d2; 947*4d6fc14bSjoerg } 948*4d6fc14bSjoerg } 949*4d6fc14bSjoerg } 950*4d6fc14bSjoerg return __r; 951*4d6fc14bSjoerg} 952*4d6fc14bSjoerg 953*4d6fc14bSjoerg// equal 954*4d6fc14bSjoerg 955*4d6fc14bSjoergtemplate <class _Cp, bool _IC1, bool _IC2> 956*4d6fc14bSjoergbool 957*4d6fc14bSjoerg__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, 958*4d6fc14bSjoerg __bit_iterator<_Cp, _IC2> __first2) 959*4d6fc14bSjoerg{ 960*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IC1> _It; 961*4d6fc14bSjoerg typedef typename _It::difference_type difference_type; 962*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 963*4d6fc14bSjoerg static const int __bits_per_word = _It::__bits_per_word; 964*4d6fc14bSjoerg difference_type __n = __last1 - __first1; 965*4d6fc14bSjoerg if (__n > 0) 966*4d6fc14bSjoerg { 967*4d6fc14bSjoerg // do first word 968*4d6fc14bSjoerg if (__first1.__ctz_ != 0) 969*4d6fc14bSjoerg { 970*4d6fc14bSjoerg unsigned __clz_f = __bits_per_word - __first1.__ctz_; 971*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); 972*4d6fc14bSjoerg __n -= __dn; 973*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); 974*4d6fc14bSjoerg __storage_type __b = *__first1.__seg_ & __m; 975*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __first2.__ctz_; 976*4d6fc14bSjoerg __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); 977*4d6fc14bSjoerg __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); 978*4d6fc14bSjoerg if (__first2.__ctz_ > __first1.__ctz_) 979*4d6fc14bSjoerg { 980*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_))) 981*4d6fc14bSjoerg return false; 982*4d6fc14bSjoerg } 983*4d6fc14bSjoerg else 984*4d6fc14bSjoerg { 985*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_))) 986*4d6fc14bSjoerg return false; 987*4d6fc14bSjoerg } 988*4d6fc14bSjoerg __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word; 989*4d6fc14bSjoerg __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_) % __bits_per_word); 990*4d6fc14bSjoerg __dn -= __ddn; 991*4d6fc14bSjoerg if (__dn > 0) 992*4d6fc14bSjoerg { 993*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __dn); 994*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn))) 995*4d6fc14bSjoerg return false; 996*4d6fc14bSjoerg __first2.__ctz_ = static_cast<unsigned>(__dn); 997*4d6fc14bSjoerg } 998*4d6fc14bSjoerg ++__first1.__seg_; 999*4d6fc14bSjoerg // __first1.__ctz_ = 0; 1000*4d6fc14bSjoerg } 1001*4d6fc14bSjoerg // __first1.__ctz_ == 0; 1002*4d6fc14bSjoerg // do middle words 1003*4d6fc14bSjoerg unsigned __clz_r = __bits_per_word - __first2.__ctz_; 1004*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) << __first2.__ctz_; 1005*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_) 1006*4d6fc14bSjoerg { 1007*4d6fc14bSjoerg __storage_type __b = *__first1.__seg_; 1008*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) 1009*4d6fc14bSjoerg return false; 1010*4d6fc14bSjoerg ++__first2.__seg_; 1011*4d6fc14bSjoerg if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r)) 1012*4d6fc14bSjoerg return false; 1013*4d6fc14bSjoerg } 1014*4d6fc14bSjoerg // do last word 1015*4d6fc14bSjoerg if (__n > 0) 1016*4d6fc14bSjoerg { 1017*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 1018*4d6fc14bSjoerg __storage_type __b = *__first1.__seg_ & __m; 1019*4d6fc14bSjoerg __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r)); 1020*4d6fc14bSjoerg __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); 1021*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) 1022*4d6fc14bSjoerg return false; 1023*4d6fc14bSjoerg __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word; 1024*4d6fc14bSjoerg __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_) % __bits_per_word); 1025*4d6fc14bSjoerg __n -= __dn; 1026*4d6fc14bSjoerg if (__n > 0) 1027*4d6fc14bSjoerg { 1028*4d6fc14bSjoerg __m = ~__storage_type(0) >> (__bits_per_word - __n); 1029*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (__b >> __dn)) 1030*4d6fc14bSjoerg return false; 1031*4d6fc14bSjoerg } 1032*4d6fc14bSjoerg } 1033*4d6fc14bSjoerg } 1034*4d6fc14bSjoerg return true; 1035*4d6fc14bSjoerg} 1036*4d6fc14bSjoerg 1037*4d6fc14bSjoergtemplate <class _Cp, bool _IC1, bool _IC2> 1038*4d6fc14bSjoergbool 1039*4d6fc14bSjoerg__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, 1040*4d6fc14bSjoerg __bit_iterator<_Cp, _IC2> __first2) 1041*4d6fc14bSjoerg{ 1042*4d6fc14bSjoerg typedef __bit_iterator<_Cp, _IC1> _It; 1043*4d6fc14bSjoerg typedef typename _It::difference_type difference_type; 1044*4d6fc14bSjoerg typedef typename _It::__storage_type __storage_type; 1045*4d6fc14bSjoerg static const int __bits_per_word = _It::__bits_per_word; 1046*4d6fc14bSjoerg difference_type __n = __last1 - __first1; 1047*4d6fc14bSjoerg if (__n > 0) 1048*4d6fc14bSjoerg { 1049*4d6fc14bSjoerg // do first word 1050*4d6fc14bSjoerg if (__first1.__ctz_ != 0) 1051*4d6fc14bSjoerg { 1052*4d6fc14bSjoerg unsigned __clz = __bits_per_word - __first1.__ctz_; 1053*4d6fc14bSjoerg difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); 1054*4d6fc14bSjoerg __n -= __dn; 1055*4d6fc14bSjoerg __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); 1056*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) 1057*4d6fc14bSjoerg return false; 1058*4d6fc14bSjoerg ++__first2.__seg_; 1059*4d6fc14bSjoerg ++__first1.__seg_; 1060*4d6fc14bSjoerg // __first1.__ctz_ = 0; 1061*4d6fc14bSjoerg // __first2.__ctz_ = 0; 1062*4d6fc14bSjoerg } 1063*4d6fc14bSjoerg // __first1.__ctz_ == 0; 1064*4d6fc14bSjoerg // __first2.__ctz_ == 0; 1065*4d6fc14bSjoerg // do middle words 1066*4d6fc14bSjoerg for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_) 1067*4d6fc14bSjoerg if (*__first2.__seg_ != *__first1.__seg_) 1068*4d6fc14bSjoerg return false; 1069*4d6fc14bSjoerg // do last word 1070*4d6fc14bSjoerg if (__n > 0) 1071*4d6fc14bSjoerg { 1072*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 1073*4d6fc14bSjoerg if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) 1074*4d6fc14bSjoerg return false; 1075*4d6fc14bSjoerg } 1076*4d6fc14bSjoerg } 1077*4d6fc14bSjoerg return true; 1078*4d6fc14bSjoerg} 1079*4d6fc14bSjoerg 1080*4d6fc14bSjoergtemplate <class _Cp, bool _IC1, bool _IC2> 1081*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1082*4d6fc14bSjoergbool 1083*4d6fc14bSjoergequal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) 1084*4d6fc14bSjoerg{ 1085*4d6fc14bSjoerg if (__first1.__ctz_ == __first2.__ctz_) 1086*4d6fc14bSjoerg return _VSTD::__equal_aligned(__first1, __last1, __first2); 1087*4d6fc14bSjoerg return _VSTD::__equal_unaligned(__first1, __last1, __first2); 1088*4d6fc14bSjoerg} 1089*4d6fc14bSjoerg 1090*4d6fc14bSjoergtemplate <class _Cp, bool _IsConst, 1091*4d6fc14bSjoerg typename _Cp::__storage_type> 1092*4d6fc14bSjoergclass __bit_iterator 1093*4d6fc14bSjoerg{ 1094*4d6fc14bSjoergpublic: 1095*4d6fc14bSjoerg typedef typename _Cp::difference_type difference_type; 1096*4d6fc14bSjoerg typedef bool value_type; 1097*4d6fc14bSjoerg typedef __bit_iterator pointer; 1098*4d6fc14bSjoerg typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference; 1099*4d6fc14bSjoerg typedef random_access_iterator_tag iterator_category; 1100*4d6fc14bSjoerg 1101*4d6fc14bSjoergprivate: 1102*4d6fc14bSjoerg typedef typename _Cp::__storage_type __storage_type; 1103*4d6fc14bSjoerg typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer, 1104*4d6fc14bSjoerg typename _Cp::__storage_pointer>::type __storage_pointer; 1105*4d6fc14bSjoerg static const unsigned __bits_per_word = _Cp::__bits_per_word; 1106*4d6fc14bSjoerg 1107*4d6fc14bSjoerg __storage_pointer __seg_; 1108*4d6fc14bSjoerg unsigned __ctz_; 1109*4d6fc14bSjoerg 1110*4d6fc14bSjoergpublic: 1111*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT 1112*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 1113*4d6fc14bSjoerg : __seg_(nullptr), __ctz_(0) 1114*4d6fc14bSjoerg#endif 1115*4d6fc14bSjoerg {} 1116*4d6fc14bSjoerg 1117*4d6fc14bSjoerg // When _IsConst=false, this is the copy constructor. 1118*4d6fc14bSjoerg // It is non-trivial. Making it trivial would break ABI. 1119*4d6fc14bSjoerg // When _IsConst=true, this is a converting constructor; 1120*4d6fc14bSjoerg // the copy and move constructors are implicitly generated 1121*4d6fc14bSjoerg // and trivial. 1122*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1123*4d6fc14bSjoerg __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT 1124*4d6fc14bSjoerg : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} 1125*4d6fc14bSjoerg 1126*4d6fc14bSjoerg // When _IsConst=false, we have a user-provided copy constructor, 1127*4d6fc14bSjoerg // so we must also provide a copy assignment operator because 1128*4d6fc14bSjoerg // the implicit generation of a defaulted one is deprecated. 1129*4d6fc14bSjoerg // When _IsConst=true, the assignment operators are 1130*4d6fc14bSjoerg // implicitly generated and trivial. 1131*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1132*4d6fc14bSjoerg __bit_iterator& operator=(const _If<_IsConst, struct __private_nat, __bit_iterator>& __it) { 1133*4d6fc14bSjoerg __seg_ = __it.__seg_; 1134*4d6fc14bSjoerg __ctz_ = __it.__ctz_; 1135*4d6fc14bSjoerg return *this; 1136*4d6fc14bSjoerg } 1137*4d6fc14bSjoerg 1138*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT 1139*4d6fc14bSjoerg {return reference(__seg_, __storage_type(1) << __ctz_);} 1140*4d6fc14bSjoerg 1141*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++() 1142*4d6fc14bSjoerg { 1143*4d6fc14bSjoerg if (__ctz_ != __bits_per_word-1) 1144*4d6fc14bSjoerg ++__ctz_; 1145*4d6fc14bSjoerg else 1146*4d6fc14bSjoerg { 1147*4d6fc14bSjoerg __ctz_ = 0; 1148*4d6fc14bSjoerg ++__seg_; 1149*4d6fc14bSjoerg } 1150*4d6fc14bSjoerg return *this; 1151*4d6fc14bSjoerg } 1152*4d6fc14bSjoerg 1153*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int) 1154*4d6fc14bSjoerg { 1155*4d6fc14bSjoerg __bit_iterator __tmp = *this; 1156*4d6fc14bSjoerg ++(*this); 1157*4d6fc14bSjoerg return __tmp; 1158*4d6fc14bSjoerg } 1159*4d6fc14bSjoerg 1160*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--() 1161*4d6fc14bSjoerg { 1162*4d6fc14bSjoerg if (__ctz_ != 0) 1163*4d6fc14bSjoerg --__ctz_; 1164*4d6fc14bSjoerg else 1165*4d6fc14bSjoerg { 1166*4d6fc14bSjoerg __ctz_ = __bits_per_word - 1; 1167*4d6fc14bSjoerg --__seg_; 1168*4d6fc14bSjoerg } 1169*4d6fc14bSjoerg return *this; 1170*4d6fc14bSjoerg } 1171*4d6fc14bSjoerg 1172*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int) 1173*4d6fc14bSjoerg { 1174*4d6fc14bSjoerg __bit_iterator __tmp = *this; 1175*4d6fc14bSjoerg --(*this); 1176*4d6fc14bSjoerg return __tmp; 1177*4d6fc14bSjoerg } 1178*4d6fc14bSjoerg 1179*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n) 1180*4d6fc14bSjoerg { 1181*4d6fc14bSjoerg if (__n >= 0) 1182*4d6fc14bSjoerg __seg_ += (__n + __ctz_) / __bits_per_word; 1183*4d6fc14bSjoerg else 1184*4d6fc14bSjoerg __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1) 1185*4d6fc14bSjoerg / static_cast<difference_type>(__bits_per_word); 1186*4d6fc14bSjoerg __n &= (__bits_per_word - 1); 1187*4d6fc14bSjoerg __ctz_ = static_cast<unsigned>((__n + __ctz_) % __bits_per_word); 1188*4d6fc14bSjoerg return *this; 1189*4d6fc14bSjoerg } 1190*4d6fc14bSjoerg 1191*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n) 1192*4d6fc14bSjoerg { 1193*4d6fc14bSjoerg return *this += -__n; 1194*4d6fc14bSjoerg } 1195*4d6fc14bSjoerg 1196*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const 1197*4d6fc14bSjoerg { 1198*4d6fc14bSjoerg __bit_iterator __t(*this); 1199*4d6fc14bSjoerg __t += __n; 1200*4d6fc14bSjoerg return __t; 1201*4d6fc14bSjoerg } 1202*4d6fc14bSjoerg 1203*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const 1204*4d6fc14bSjoerg { 1205*4d6fc14bSjoerg __bit_iterator __t(*this); 1206*4d6fc14bSjoerg __t -= __n; 1207*4d6fc14bSjoerg return __t; 1208*4d6fc14bSjoerg } 1209*4d6fc14bSjoerg 1210*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1211*4d6fc14bSjoerg friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;} 1212*4d6fc14bSjoerg 1213*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1214*4d6fc14bSjoerg friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y) 1215*4d6fc14bSjoerg {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;} 1216*4d6fc14bSjoerg 1217*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);} 1218*4d6fc14bSjoerg 1219*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y) 1220*4d6fc14bSjoerg {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;} 1221*4d6fc14bSjoerg 1222*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y) 1223*4d6fc14bSjoerg {return !(__x == __y);} 1224*4d6fc14bSjoerg 1225*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y) 1226*4d6fc14bSjoerg {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);} 1227*4d6fc14bSjoerg 1228*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y) 1229*4d6fc14bSjoerg {return __y < __x;} 1230*4d6fc14bSjoerg 1231*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y) 1232*4d6fc14bSjoerg {return !(__y < __x);} 1233*4d6fc14bSjoerg 1234*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y) 1235*4d6fc14bSjoerg {return !(__x < __y);} 1236*4d6fc14bSjoerg 1237*4d6fc14bSjoergprivate: 1238*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1239*4d6fc14bSjoerg __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT 1240*4d6fc14bSjoerg : __seg_(__s), __ctz_(__ctz) {} 1241*4d6fc14bSjoerg 1242*4d6fc14bSjoerg friend typename _Cp::__self; 1243*4d6fc14bSjoerg 1244*4d6fc14bSjoerg friend class __bit_reference<_Cp>; 1245*4d6fc14bSjoerg friend class __bit_const_reference<_Cp>; 1246*4d6fc14bSjoerg friend class __bit_iterator<_Cp, true>; 1247*4d6fc14bSjoerg template <class _Dp> friend struct __bit_array; 1248*4d6fc14bSjoerg template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); 1249*4d6fc14bSjoerg template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); 1250*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first, 1251*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1252*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1253*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first, 1254*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1255*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1256*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first, 1257*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1258*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1259*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first, 1260*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1261*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1262*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first, 1263*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1264*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1265*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first, 1266*4d6fc14bSjoerg __bit_iterator<_Dp, _IC> __last, 1267*4d6fc14bSjoerg __bit_iterator<_Dp, false> __result); 1268*4d6fc14bSjoerg template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>, 1269*4d6fc14bSjoerg __bit_iterator<__C1, false>, 1270*4d6fc14bSjoerg __bit_iterator<__C2, false>); 1271*4d6fc14bSjoerg template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>, 1272*4d6fc14bSjoerg __bit_iterator<__C1, false>, 1273*4d6fc14bSjoerg __bit_iterator<__C2, false>); 1274*4d6fc14bSjoerg template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>, 1275*4d6fc14bSjoerg __bit_iterator<__C1, false>, 1276*4d6fc14bSjoerg __bit_iterator<__C2, false>); 1277*4d6fc14bSjoerg template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>, 1278*4d6fc14bSjoerg __bit_iterator<_Dp, false>, 1279*4d6fc14bSjoerg __bit_iterator<_Dp, false>); 1280*4d6fc14bSjoerg template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>, 1281*4d6fc14bSjoerg __bit_iterator<_Dp, _IC1>, 1282*4d6fc14bSjoerg __bit_iterator<_Dp, _IC2>); 1283*4d6fc14bSjoerg template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>, 1284*4d6fc14bSjoerg __bit_iterator<_Dp, _IC1>, 1285*4d6fc14bSjoerg __bit_iterator<_Dp, _IC2>); 1286*4d6fc14bSjoerg template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>, 1287*4d6fc14bSjoerg __bit_iterator<_Dp, _IC1>, 1288*4d6fc14bSjoerg __bit_iterator<_Dp, _IC2>); 1289*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>, 1290*4d6fc14bSjoerg typename _Dp::size_type); 1291*4d6fc14bSjoerg template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>, 1292*4d6fc14bSjoerg typename _Dp::size_type); 1293*4d6fc14bSjoerg template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type 1294*4d6fc14bSjoerg __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); 1295*4d6fc14bSjoerg template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type 1296*4d6fc14bSjoerg __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); 1297*4d6fc14bSjoerg}; 1298*4d6fc14bSjoerg 1299*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 1300*4d6fc14bSjoerg 1301*4d6fc14bSjoerg_LIBCPP_POP_MACROS 1302*4d6fc14bSjoerg 1303*4d6fc14bSjoerg#endif // _LIBCPP___BIT_REFERENCE 1304