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