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