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