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