13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP___BIT_REFERENCE
113e519524SHoward Hinnant#define _LIBCPP___BIT_REFERENCE
123e519524SHoward Hinnant
133e519524SHoward Hinnant#include <__config>
14*b973e2e2SThorsten Schütt#include <__bits>
153e519524SHoward Hinnant#include <algorithm>
163e519524SHoward Hinnant
17073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
183e519524SHoward Hinnant#pragma GCC system_header
19073458b1SHoward Hinnant#endif
203e519524SHoward Hinnant
21a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
22a016efb1SEric Fiselier#include <__undef_macros>
23a016efb1SEric Fiselier
24a016efb1SEric Fiselier
253e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
263e519524SHoward Hinnant
270ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
28c003db1fSHoward Hinnanttemplate <class _Cp> class __bit_const_reference;
293e519524SHoward Hinnant
30a7744562SHoward Hinnanttemplate <class _Tp>
31a7744562SHoward Hinnantstruct __has_storage_type
32a7744562SHoward Hinnant{
33a7744562SHoward Hinnant    static const bool value = false;
34a7744562SHoward Hinnant};
35a7744562SHoward Hinnant
36c003db1fSHoward Hinnanttemplate <class _Cp, bool = __has_storage_type<_Cp>::value>
373e519524SHoward Hinnantclass __bit_reference
383e519524SHoward Hinnant{
39c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type    __storage_type;
40c003db1fSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
413e519524SHoward Hinnant
423e519524SHoward Hinnant    __storage_pointer __seg_;
433e519524SHoward Hinnant    __storage_type    __mask_;
443e519524SHoward Hinnant
45c003db1fSHoward Hinnant    friend typename _Cp::__self;
46541f9e28SEric Fiselier
47c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
48c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, false>;
493e519524SHoward Hinnantpublic:
50b7eb30d4SFangrui Song    _LIBCPP_INLINE_VISIBILITY
51b7eb30d4SFangrui Song    __bit_reference(const __bit_reference&) = default;
52b7eb30d4SFangrui Song
53d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT
54d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
55d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT
56d368a84cSHoward Hinnant        {return !static_cast<bool>(*this);}
573e519524SHoward Hinnant
583e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
59d368a84cSHoward Hinnant    __bit_reference& operator=(bool __x) _NOEXCEPT
603e519524SHoward Hinnant    {
613e519524SHoward Hinnant        if (__x)
623e519524SHoward Hinnant            *__seg_ |= __mask_;
633e519524SHoward Hinnant        else
643e519524SHoward Hinnant            *__seg_ &= ~__mask_;
653e519524SHoward Hinnant        return *this;
663e519524SHoward Hinnant    }
673e519524SHoward Hinnant
683e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
69d368a84cSHoward Hinnant    __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT
70d368a84cSHoward Hinnant        {return operator=(static_cast<bool>(__x));}
713e519524SHoward Hinnant
72d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;}
73c003db1fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT
74f3b851f0SMarshall Clow        {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
753e519524SHoward Hinnantprivate:
763e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
77d368a84cSHoward Hinnant    __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
78d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
793e519524SHoward Hinnant};
803e519524SHoward Hinnant
81c003db1fSHoward Hinnanttemplate <class _Cp>
82c003db1fSHoward Hinnantclass __bit_reference<_Cp, false>
83a7744562SHoward Hinnant{
84a7744562SHoward Hinnant};
85a7744562SHoward Hinnant
86d9db9f90SHoward Hinnanttemplate <class _Cp>
873af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
88d9db9f90SHoward Hinnantvoid
89d9db9f90SHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
90d9db9f90SHoward Hinnant{
91d9db9f90SHoward Hinnant    bool __t = __x;
92d9db9f90SHoward Hinnant    __x = __y;
93d9db9f90SHoward Hinnant    __y = __t;
94d9db9f90SHoward Hinnant}
95d9db9f90SHoward Hinnant
96c003db1fSHoward Hinnanttemplate <class _Cp, class _Dp>
973af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
983e519524SHoward Hinnantvoid
99c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
1003e519524SHoward Hinnant{
1013e519524SHoward Hinnant    bool __t = __x;
1023e519524SHoward Hinnant    __x = __y;
1033e519524SHoward Hinnant    __y = __t;
1043e519524SHoward Hinnant}
1053e519524SHoward Hinnant
106c003db1fSHoward Hinnanttemplate <class _Cp>
1073af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1083e519524SHoward Hinnantvoid
109c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
1103e519524SHoward Hinnant{
1113e519524SHoward Hinnant    bool __t = __x;
1123e519524SHoward Hinnant    __x = __y;
1133e519524SHoward Hinnant    __y = __t;
1143e519524SHoward Hinnant}
1153e519524SHoward Hinnant
116c003db1fSHoward Hinnanttemplate <class _Cp>
1173af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1183e519524SHoward Hinnantvoid
119c003db1fSHoward Hinnantswap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
1203e519524SHoward Hinnant{
1213e519524SHoward Hinnant    bool __t = __x;
1223e519524SHoward Hinnant    __x = __y;
1233e519524SHoward Hinnant    __y = __t;
1243e519524SHoward Hinnant}
1253e519524SHoward Hinnant
126c003db1fSHoward Hinnanttemplate <class _Cp>
1273e519524SHoward Hinnantclass __bit_const_reference
1283e519524SHoward Hinnant{
129c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type          __storage_type;
130c003db1fSHoward Hinnant    typedef typename _Cp::__const_storage_pointer __storage_pointer;
1313e519524SHoward Hinnant
1323e519524SHoward Hinnant    __storage_pointer        __seg_;
1333e519524SHoward Hinnant    __storage_type __mask_;
1343e519524SHoward Hinnant
135c003db1fSHoward Hinnant    friend typename _Cp::__self;
136c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1373e519524SHoward Hinnantpublic:
1383e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
139b7eb30d4SFangrui Song    __bit_const_reference(const __bit_const_reference&) = default;
140b7eb30d4SFangrui Song
141b7eb30d4SFangrui Song    _LIBCPP_INLINE_VISIBILITY
142c003db1fSHoward Hinnant    __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
1433e519524SHoward Hinnant        : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
1443e519524SHoward Hinnant
145eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT
146d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
1473e519524SHoward Hinnant
148c003db1fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT
149f3b851f0SMarshall Clow        {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
1503e519524SHoward Hinnantprivate:
1513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
152eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR
153d368a84cSHoward Hinnant    __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
154d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
1553e519524SHoward Hinnant
156b7eb30d4SFangrui Song    __bit_const_reference& operator=(const __bit_const_reference&) = delete;
1573e519524SHoward Hinnant};
1583e519524SHoward Hinnant
1593e519524SHoward Hinnant// find
1603e519524SHoward Hinnant
161423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
162423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
163423a8d77SHoward Hinnant__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
1643e519524SHoward Hinnant{
165423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
1663e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
167aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
1683e519524SHoward Hinnant    // do first partial word
1693e519524SHoward Hinnant    if (__first.__ctz_ != 0)
1703e519524SHoward Hinnant    {
1713e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
172ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
1733e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
1743e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1753e519524SHoward Hinnant        if (__b)
176f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
177303e27d8SHoward Hinnant        if (__n == __dn)
1780fc6e981SMarshall Clow            return __first + __n;
1793e519524SHoward Hinnant        __n -= __dn;
1803e519524SHoward Hinnant        ++__first.__seg_;
1813e519524SHoward Hinnant    }
1823e519524SHoward Hinnant    // do middle whole words
1833e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
1843e519524SHoward Hinnant        if (*__first.__seg_)
185f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(*__first.__seg_)));
1863e519524SHoward Hinnant    // do last partial word
1873e519524SHoward Hinnant    if (__n > 0)
1883e519524SHoward Hinnant    {
1893e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
1903e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1913e519524SHoward Hinnant        if (__b)
192f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
1933e519524SHoward Hinnant    }
1943e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
1953e519524SHoward Hinnant}
1963e519524SHoward Hinnant
197423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
198423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
199423a8d77SHoward Hinnant__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2003e519524SHoward Hinnant{
201423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2023e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
203aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2043e519524SHoward Hinnant    // do first partial word
2053e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2063e519524SHoward Hinnant    {
2073e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
208ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2093e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
210423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2113e519524SHoward Hinnant        if (__b)
212f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
213303e27d8SHoward Hinnant        if (__n == __dn)
2140fc6e981SMarshall Clow            return __first + __n;
2153e519524SHoward Hinnant        __n -= __dn;
2163e519524SHoward Hinnant        ++__first.__seg_;
2173e519524SHoward Hinnant    }
2183e519524SHoward Hinnant    // do middle whole words
2193e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2203e519524SHoward Hinnant    {
2213e519524SHoward Hinnant        __storage_type __b = ~*__first.__seg_;
2223e519524SHoward Hinnant        if (__b)
223f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
2243e519524SHoward Hinnant    }
2253e519524SHoward Hinnant    // do last partial word
2263e519524SHoward Hinnant    if (__n > 0)
2273e519524SHoward Hinnant    {
2283e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
229423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2303e519524SHoward Hinnant        if (__b)
231f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
2323e519524SHoward Hinnant    }
2333e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
2343e519524SHoward Hinnant}
2353e519524SHoward Hinnant
236423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
2373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
238423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
239423a8d77SHoward Hinnantfind(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
2403e519524SHoward Hinnant{
241e4383379SHoward Hinnant    if (static_cast<bool>(__value_))
242781c476cSArthur O'Dwyer        return _VSTD::__find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
243781c476cSArthur O'Dwyer    return _VSTD::__find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
2443e519524SHoward Hinnant}
2453e519524SHoward Hinnant
2463e519524SHoward Hinnant// count
2473e519524SHoward Hinnant
248423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
249423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
250423a8d77SHoward Hinnant__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2513e519524SHoward Hinnant{
252423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2533e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2543e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
255aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2563e519524SHoward Hinnant    difference_type __r = 0;
2573e519524SHoward Hinnant    // do first partial word
2583e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2593e519524SHoward Hinnant    {
2603e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
261ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2623e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
263f3b851f0SMarshall Clow        __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
2643e519524SHoward Hinnant        __n -= __dn;
2653e519524SHoward Hinnant        ++__first.__seg_;
2663e519524SHoward Hinnant    }
2673e519524SHoward Hinnant    // do middle whole words
2683e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
269f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(*__first.__seg_);
2703e519524SHoward Hinnant    // do last partial word
2713e519524SHoward Hinnant    if (__n > 0)
2723e519524SHoward Hinnant    {
2733e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
274f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
2753e519524SHoward Hinnant    }
2763e519524SHoward Hinnant    return __r;
2773e519524SHoward Hinnant}
2783e519524SHoward Hinnant
279423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
280423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
281423a8d77SHoward Hinnant__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2823e519524SHoward Hinnant{
283423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2843e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2853e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
286aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2873e519524SHoward Hinnant    difference_type __r = 0;
2883e519524SHoward Hinnant    // do first partial word
2893e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2903e519524SHoward Hinnant    {
2913e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
292ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2933e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
294f3b851f0SMarshall Clow        __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
2953e519524SHoward Hinnant        __n -= __dn;
2963e519524SHoward Hinnant        ++__first.__seg_;
2973e519524SHoward Hinnant    }
2983e519524SHoward Hinnant    // do middle whole words
2993e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
300f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(~*__first.__seg_);
3013e519524SHoward Hinnant    // do last partial word
3023e519524SHoward Hinnant    if (__n > 0)
3033e519524SHoward Hinnant    {
3043e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
305f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
3063e519524SHoward Hinnant    }
3073e519524SHoward Hinnant    return __r;
3083e519524SHoward Hinnant}
3093e519524SHoward Hinnant
310423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
3113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
312423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
313423a8d77SHoward Hinnantcount(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
3143e519524SHoward Hinnant{
315e4383379SHoward Hinnant    if (static_cast<bool>(__value_))
316781c476cSArthur O'Dwyer        return _VSTD::__count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
317781c476cSArthur O'Dwyer    return _VSTD::__count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
3183e519524SHoward Hinnant}
3193e519524SHoward Hinnant
3203e519524SHoward Hinnant// fill_n
3213e519524SHoward Hinnant
322c003db1fSHoward Hinnanttemplate <class _Cp>
3233e519524SHoward Hinnantvoid
324c003db1fSHoward Hinnant__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3253e519524SHoward Hinnant{
326c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3273e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
328aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3293e519524SHoward Hinnant    // do first partial word
3303e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3313e519524SHoward Hinnant    {
3323e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
333ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3343e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3353e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3363e519524SHoward Hinnant        __n -= __dn;
3373e519524SHoward Hinnant        ++__first.__seg_;
3383e519524SHoward Hinnant    }
3393e519524SHoward Hinnant    // do middle whole words
3403e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3410068c591SEric Fiselier    _VSTD::memset(_VSTD::__to_address(__first.__seg_), 0, __nw * sizeof(__storage_type));
3423e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3433e519524SHoward Hinnant    // do last partial word
3443e519524SHoward Hinnant    if (__n > 0)
3453e519524SHoward Hinnant    {
3463e519524SHoward Hinnant        __first.__seg_ += __nw;
3473e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3483e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3493e519524SHoward Hinnant    }
3503e519524SHoward Hinnant}
3513e519524SHoward Hinnant
352c003db1fSHoward Hinnanttemplate <class _Cp>
3533e519524SHoward Hinnantvoid
354c003db1fSHoward Hinnant__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3553e519524SHoward Hinnant{
356c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3573e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
358aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3593e519524SHoward Hinnant    // do first partial word
3603e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3613e519524SHoward Hinnant    {
3623e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
363ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3643e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3653e519524SHoward Hinnant        *__first.__seg_ |= __m;
3663e519524SHoward Hinnant        __n -= __dn;
3673e519524SHoward Hinnant        ++__first.__seg_;
3683e519524SHoward Hinnant    }
3693e519524SHoward Hinnant    // do middle whole words
3703e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3710068c591SEric Fiselier    _VSTD::memset(_VSTD::__to_address(__first.__seg_), -1, __nw * sizeof(__storage_type));
3723e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3733e519524SHoward Hinnant    // do last partial word
3743e519524SHoward Hinnant    if (__n > 0)
3753e519524SHoward Hinnant    {
3763e519524SHoward Hinnant        __first.__seg_ += __nw;
3773e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3783e519524SHoward Hinnant        *__first.__seg_ |= __m;
3793e519524SHoward Hinnant    }
3803e519524SHoward Hinnant}
3813e519524SHoward Hinnant
382c003db1fSHoward Hinnanttemplate <class _Cp>
3833af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3843e519524SHoward Hinnantvoid
385c003db1fSHoward Hinnantfill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_)
3863e519524SHoward Hinnant{
3873e519524SHoward Hinnant    if (__n > 0)
3883e519524SHoward Hinnant    {
389e4383379SHoward Hinnant        if (__value_)
390781c476cSArthur O'Dwyer            _VSTD::__fill_n_true(__first, __n);
3913e519524SHoward Hinnant        else
392781c476cSArthur O'Dwyer            _VSTD::__fill_n_false(__first, __n);
3933e519524SHoward Hinnant    }
3943e519524SHoward Hinnant}
3953e519524SHoward Hinnant
3963e519524SHoward Hinnant// fill
3973e519524SHoward Hinnant
398c003db1fSHoward Hinnanttemplate <class _Cp>
3993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4003e519524SHoward Hinnantvoid
401c003db1fSHoward Hinnantfill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_)
4023e519524SHoward Hinnant{
403c003db1fSHoward Hinnant    _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_);
4043e519524SHoward Hinnant}
4053e519524SHoward Hinnant
4063e519524SHoward Hinnant// copy
4073e519524SHoward Hinnant
408c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
409c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
410c003db1fSHoward Hinnant__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
411c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
4123e519524SHoward Hinnant{
413c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4143e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4153e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
416aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
4173e519524SHoward Hinnant    difference_type __n = __last - __first;
4183e519524SHoward Hinnant    if (__n > 0)
4193e519524SHoward Hinnant    {
4203e519524SHoward Hinnant        // do first word
4213e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4223e519524SHoward Hinnant        {
4233e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
424ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
4253e519524SHoward Hinnant            __n -= __dn;
4263e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
4273e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4283e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4293e519524SHoward Hinnant            *__result.__seg_ |= __b;
4303e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
4313e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
4323e519524SHoward Hinnant            ++__first.__seg_;
4333e519524SHoward Hinnant            // __first.__ctz_ = 0;
4343e519524SHoward Hinnant        }
4353e519524SHoward Hinnant        // __first.__ctz_ == 0;
4363e519524SHoward Hinnant        // do middle words
4373e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
4380068c591SEric Fiselier        _VSTD::memmove(_VSTD::__to_address(__result.__seg_),
4390068c591SEric Fiselier                       _VSTD::__to_address(__first.__seg_),
4403ec1f00bSHoward Hinnant                       __nw * sizeof(__storage_type));
4413e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
4423e519524SHoward Hinnant        __result.__seg_ += __nw;
4433e519524SHoward Hinnant        // do last word
4443e519524SHoward Hinnant        if (__n > 0)
4453e519524SHoward Hinnant        {
4463e519524SHoward Hinnant            __first.__seg_ += __nw;
4473e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4483e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4493e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4503e519524SHoward Hinnant            *__result.__seg_ |= __b;
4513e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
4523e519524SHoward Hinnant        }
4533e519524SHoward Hinnant    }
4543e519524SHoward Hinnant    return __result;
4553e519524SHoward Hinnant}
4563e519524SHoward Hinnant
457c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
458c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
459c003db1fSHoward Hinnant__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
460c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
4613e519524SHoward Hinnant{
462c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4633e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4643e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
465aec08784SEric Fiselier    static const int __bits_per_word = _In::__bits_per_word;
4663e519524SHoward Hinnant    difference_type __n = __last - __first;
4673e519524SHoward Hinnant    if (__n > 0)
4683e519524SHoward Hinnant    {
4693e519524SHoward Hinnant        // do first word
4703e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4713e519524SHoward Hinnant        {
4723e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
473ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
4743e519524SHoward Hinnant            __n -= __dn;
4753e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
4763e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4773e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
478ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
4793e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
4803e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4813e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
4823e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
4833e519524SHoward Hinnant            else
4843e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
4853e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
4863e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
4873e519524SHoward Hinnant            __dn -= __ddn;
4883e519524SHoward Hinnant            if (__dn > 0)
4893e519524SHoward Hinnant            {
4903e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
4913e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
4923e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
4933e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
4943e519524SHoward Hinnant            }
4953e519524SHoward Hinnant            ++__first.__seg_;
4963e519524SHoward Hinnant            // __first.__ctz_ = 0;
4973e519524SHoward Hinnant        }
4983e519524SHoward Hinnant        // __first.__ctz_ == 0;
4993e519524SHoward Hinnant        // do middle words
5003e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
5013e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
5023e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
5033e519524SHoward Hinnant        {
5043e519524SHoward Hinnant            __storage_type __b = *__first.__seg_;
5053e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5063e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5073e519524SHoward Hinnant            ++__result.__seg_;
5083e519524SHoward Hinnant            *__result.__seg_ &= __m;
5093e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
5103e519524SHoward Hinnant        }
5113e519524SHoward Hinnant        // do last word
5123e519524SHoward Hinnant        if (__n > 0)
5133e519524SHoward Hinnant        {
5143e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
5153e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
516ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
5173e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
5183e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5193e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5203e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
5213e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
5223e519524SHoward Hinnant            __n -= __dn;
5233e519524SHoward Hinnant            if (__n > 0)
5243e519524SHoward Hinnant            {
5253e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
5263e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5273e519524SHoward Hinnant                *__result.__seg_ |= __b >> __dn;
5283e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
5293e519524SHoward Hinnant            }
5303e519524SHoward Hinnant        }
5313e519524SHoward Hinnant    }
5323e519524SHoward Hinnant    return __result;
5333e519524SHoward Hinnant}
5343e519524SHoward Hinnant
535c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
5363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
537c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
538c003db1fSHoward Hinnantcopy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
5393e519524SHoward Hinnant{
5403e519524SHoward Hinnant    if (__first.__ctz_ == __result.__ctz_)
541781c476cSArthur O'Dwyer        return _VSTD::__copy_aligned(__first, __last, __result);
542781c476cSArthur O'Dwyer    return _VSTD::__copy_unaligned(__first, __last, __result);
5433e519524SHoward Hinnant}
5443e519524SHoward Hinnant
5453e519524SHoward Hinnant// copy_backward
5463e519524SHoward Hinnant
547c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
548c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
549c003db1fSHoward Hinnant__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
550c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
5513e519524SHoward Hinnant{
552c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
5533e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
5543e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
555aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
5563e519524SHoward Hinnant    difference_type __n = __last - __first;
5573e519524SHoward Hinnant    if (__n > 0)
5583e519524SHoward Hinnant    {
5593e519524SHoward Hinnant        // do first word
5603e519524SHoward Hinnant        if (__last.__ctz_ != 0)
5613e519524SHoward Hinnant        {
562ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
5633e519524SHoward Hinnant            __n -= __dn;
5643e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __last.__ctz_;
5653e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
5663e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
5673e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5683e519524SHoward Hinnant            *__result.__seg_ |= __b;
5693e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
5703e519524SHoward Hinnant                                                       __result.__ctz_)  % __bits_per_word);
5713e519524SHoward Hinnant            // __last.__ctz_ = 0
5723e519524SHoward Hinnant         }
5733e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
5743e519524SHoward Hinnant        // __result.__ctz_ == 0 || __n == 0
5753e519524SHoward Hinnant        // do middle words
5763e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
5773e519524SHoward Hinnant        __result.__seg_ -= __nw;
5783e519524SHoward Hinnant        __last.__seg_ -= __nw;
5790068c591SEric Fiselier        _VSTD::memmove(_VSTD::__to_address(__result.__seg_),
5800068c591SEric Fiselier                       _VSTD::__to_address(__last.__seg_),
5813ec1f00bSHoward Hinnant                       __nw * sizeof(__storage_type));
5823e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
5833e519524SHoward Hinnant        // do last word
5843e519524SHoward Hinnant        if (__n > 0)
5853e519524SHoward Hinnant        {
5863e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
5873e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
5883e519524SHoward Hinnant            *--__result.__seg_ &= ~__m;
5893e519524SHoward Hinnant            *__result.__seg_ |= __b;
5903e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
5913e519524SHoward Hinnant        }
5923e519524SHoward Hinnant    }
5933e519524SHoward Hinnant    return __result;
5943e519524SHoward Hinnant}
5953e519524SHoward Hinnant
596c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
597c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
598c003db1fSHoward Hinnant__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
599c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
6003e519524SHoward Hinnant{
601c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
6023e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
6033e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
604aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
6053e519524SHoward Hinnant    difference_type __n = __last - __first;
6063e519524SHoward Hinnant    if (__n > 0)
6073e519524SHoward Hinnant    {
6083e519524SHoward Hinnant        // do first word
6093e519524SHoward Hinnant        if (__last.__ctz_ != 0)
6103e519524SHoward Hinnant        {
611ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
6123e519524SHoward Hinnant            __n -= __dn;
6133e519524SHoward Hinnant            unsigned __clz_l = __bits_per_word - __last.__ctz_;
6143e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
6153e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
6163e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
617ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_));
6183e519524SHoward Hinnant            if (__ddn > 0)
6193e519524SHoward Hinnant            {
6203e519524SHoward Hinnant                __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
6213e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6223e519524SHoward Hinnant                if (__result.__ctz_ > __last.__ctz_)
6233e519524SHoward Hinnant                    *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6243e519524SHoward Hinnant                else
6253e519524SHoward Hinnant                    *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
6263e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
6273e519524SHoward Hinnant                                                         __result.__ctz_)  % __bits_per_word);
6283e519524SHoward Hinnant                __dn -= __ddn;
6293e519524SHoward Hinnant            }
6303e519524SHoward Hinnant            if (__dn > 0)
6313e519524SHoward Hinnant            {
6323e519524SHoward Hinnant                // __result.__ctz_ == 0
6333e519524SHoward Hinnant                --__result.__seg_;
6343e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
6353e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6363e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6373e519524SHoward Hinnant                __last.__ctz_ -= __dn + __ddn;
6383e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6393e519524SHoward Hinnant            }
6403e519524SHoward Hinnant            // __last.__ctz_ = 0
6413e519524SHoward Hinnant         }
6423e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
6433e519524SHoward Hinnant        // __result.__ctz_ != 0 || __n == 0
6443e519524SHoward Hinnant        // do middle words
6453e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
6463e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> __clz_r;
6473e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word)
6483e519524SHoward Hinnant        {
6493e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_;
6503e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6513e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
6523e519524SHoward Hinnant            *--__result.__seg_ &= __m;
6533e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
6543e519524SHoward Hinnant        }
6553e519524SHoward Hinnant        // do last word
6563e519524SHoward Hinnant        if (__n > 0)
6573e519524SHoward Hinnant        {
6583e519524SHoward Hinnant            __m = ~__storage_type(0) << (__bits_per_word - __n);
6593e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
660c206366fSHoward Hinnant            __clz_r = __bits_per_word - __result.__ctz_;
661ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_));
6623e519524SHoward Hinnant            __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
6633e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6643e519524SHoward Hinnant            *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
6653e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
6663e519524SHoward Hinnant                                                     __result.__ctz_)  % __bits_per_word);
6673e519524SHoward Hinnant            __n -= __dn;
6683e519524SHoward Hinnant            if (__n > 0)
6693e519524SHoward Hinnant            {
6703e519524SHoward Hinnant                // __result.__ctz_ == 0
6713e519524SHoward Hinnant                --__result.__seg_;
6723e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
6733e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6743e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6753e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
6763e519524SHoward Hinnant            }
6773e519524SHoward Hinnant        }
6783e519524SHoward Hinnant    }
6793e519524SHoward Hinnant    return __result;
6803e519524SHoward Hinnant}
6813e519524SHoward Hinnant
682c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
6833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
684c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
685c003db1fSHoward Hinnantcopy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
6863e519524SHoward Hinnant{
6873e519524SHoward Hinnant    if (__last.__ctz_ == __result.__ctz_)
688781c476cSArthur O'Dwyer        return _VSTD::__copy_backward_aligned(__first, __last, __result);
689781c476cSArthur O'Dwyer    return _VSTD::__copy_backward_unaligned(__first, __last, __result);
6903e519524SHoward Hinnant}
6913e519524SHoward Hinnant
6923e519524SHoward Hinnant// move
6933e519524SHoward Hinnant
694c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
6953e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
696c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
697c003db1fSHoward Hinnantmove(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
6983e519524SHoward Hinnant{
699ce48a113SHoward Hinnant    return _VSTD::copy(__first, __last, __result);
7003e519524SHoward Hinnant}
7013e519524SHoward Hinnant
7023e519524SHoward Hinnant// move_backward
7033e519524SHoward Hinnant
704c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
7053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
706c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
707c003db1fSHoward Hinnantmove_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
7083e519524SHoward Hinnant{
70908de4b0dSMarshall Clow    return _VSTD::copy_backward(__first, __last, __result);
7103e519524SHoward Hinnant}
7113e519524SHoward Hinnant
7123e519524SHoward Hinnant// swap_ranges
7133e519524SHoward Hinnant
714dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
715dbe81119SHoward Hinnant__bit_iterator<__C2, false>
716dbe81119SHoward Hinnant__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
717dbe81119SHoward Hinnant                      __bit_iterator<__C2, false> __result)
7183e519524SHoward Hinnant{
719dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7203e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7213e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
722aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7233e519524SHoward Hinnant    difference_type __n = __last - __first;
7243e519524SHoward Hinnant    if (__n > 0)
7253e519524SHoward Hinnant    {
7263e519524SHoward Hinnant        // do first word
7273e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7283e519524SHoward Hinnant        {
7293e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
730ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
7313e519524SHoward Hinnant            __n -= __dn;
7323e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
7333e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7343e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7353e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7363e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7373e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7383e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7393e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
7403e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
7413e519524SHoward Hinnant            ++__first.__seg_;
7423e519524SHoward Hinnant            // __first.__ctz_ = 0;
7433e519524SHoward Hinnant        }
7443e519524SHoward Hinnant        // __first.__ctz_ == 0;
7453e519524SHoward Hinnant        // do middle words
7463e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
7473e519524SHoward Hinnant            swap(*__first.__seg_, *__result.__seg_);
7483e519524SHoward Hinnant        // do last word
7493e519524SHoward Hinnant        if (__n > 0)
7503e519524SHoward Hinnant        {
7513e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
7523e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7533e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7543e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7553e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7563e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7573e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7583e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
7593e519524SHoward Hinnant        }
7603e519524SHoward Hinnant    }
7613e519524SHoward Hinnant    return __result;
7623e519524SHoward Hinnant}
7633e519524SHoward Hinnant
764dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
765dbe81119SHoward Hinnant__bit_iterator<__C2, false>
766dbe81119SHoward Hinnant__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
767dbe81119SHoward Hinnant                        __bit_iterator<__C2, false> __result)
7683e519524SHoward Hinnant{
769dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7703e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7713e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
772aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7733e519524SHoward Hinnant    difference_type __n = __last - __first;
7743e519524SHoward Hinnant    if (__n > 0)
7753e519524SHoward Hinnant    {
7763e519524SHoward Hinnant        // do first word
7773e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7783e519524SHoward Hinnant        {
7793e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
780ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
7813e519524SHoward Hinnant            __n -= __dn;
7823e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
7833e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7843e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7853e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
786ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
7873e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
7883e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7893e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7903e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
7913e519524SHoward Hinnant            {
7923e519524SHoward Hinnant                unsigned __s = __result.__ctz_ - __first.__ctz_;
7933e519524SHoward Hinnant                *__result.__seg_ |= __b1 << __s;
7943e519524SHoward Hinnant                *__first.__seg_  |= __b2 >> __s;
7953e519524SHoward Hinnant            }
7963e519524SHoward Hinnant            else
7973e519524SHoward Hinnant            {
7983e519524SHoward Hinnant                unsigned __s = __first.__ctz_ - __result.__ctz_;
7993e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
8003e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8013e519524SHoward Hinnant            }
8023e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
8033e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
8043e519524SHoward Hinnant            __dn -= __ddn;
8053e519524SHoward Hinnant            if (__dn > 0)
8063e519524SHoward Hinnant            {
8073e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
8083e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8093e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8103e519524SHoward Hinnant                unsigned __s = __first.__ctz_ + __ddn;
8113e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
8123e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8133e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
8143e519524SHoward Hinnant            }
8153e519524SHoward Hinnant            ++__first.__seg_;
8163e519524SHoward Hinnant            // __first.__ctz_ = 0;
8173e519524SHoward Hinnant        }
8183e519524SHoward Hinnant        // __first.__ctz_ == 0;
8193e519524SHoward Hinnant        // do middle words
8203e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
8213e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
8223e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
8233e519524SHoward Hinnant        {
8243e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_;
8253e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8263e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8273e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8283e519524SHoward Hinnant            *__first.__seg_  = __b2 >> __result.__ctz_;
8293e519524SHoward Hinnant            ++__result.__seg_;
8303e519524SHoward Hinnant            __b2 = *__result.__seg_ & ~__m;
8313e519524SHoward Hinnant            *__result.__seg_ &= __m;
8323e519524SHoward Hinnant            *__result.__seg_ |= __b1 >> __clz_r;
8333e519524SHoward Hinnant            *__first.__seg_  |= __b2 << __clz_r;
8343e519524SHoward Hinnant        }
8353e519524SHoward Hinnant        // do last word
8363e519524SHoward Hinnant        if (__n > 0)
8373e519524SHoward Hinnant        {
8383e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
8393e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
8403e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
841ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r);
8423e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
8433e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8443e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8453e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8463e519524SHoward Hinnant            *__first.__seg_  |= __b2 >> __result.__ctz_;
8473e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
8483e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
8493e519524SHoward Hinnant            __n -= __dn;
8503e519524SHoward Hinnant            if (__n > 0)
8513e519524SHoward Hinnant            {
8523e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
8533e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8543e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8553e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __dn;
8563e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __dn;
8573e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
8583e519524SHoward Hinnant            }
8593e519524SHoward Hinnant        }
8603e519524SHoward Hinnant    }
8613e519524SHoward Hinnant    return __result;
8623e519524SHoward Hinnant}
8633e519524SHoward Hinnant
864dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
8653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
866dbe81119SHoward Hinnant__bit_iterator<__C2, false>
867dbe81119SHoward Hinnantswap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1,
868dbe81119SHoward Hinnant            __bit_iterator<__C2, false> __first2)
8693e519524SHoward Hinnant{
8703e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
871781c476cSArthur O'Dwyer        return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2);
872781c476cSArthur O'Dwyer    return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2);
8733e519524SHoward Hinnant}
8743e519524SHoward Hinnant
8753e519524SHoward Hinnant// rotate
8763e519524SHoward Hinnant
877c003db1fSHoward Hinnanttemplate <class _Cp>
8783e519524SHoward Hinnantstruct __bit_array
8793e519524SHoward Hinnant{
880c003db1fSHoward Hinnant    typedef typename _Cp::difference_type difference_type;
881c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type  __storage_type;
8823ec1f00bSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
883c003db1fSHoward Hinnant    typedef typename _Cp::iterator        iterator;
884c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
885c003db1fSHoward Hinnant    static const unsigned _Np = 4;
8863e519524SHoward Hinnant
8873e519524SHoward Hinnant    difference_type __size_;
888c003db1fSHoward Hinnant    __storage_type __word_[_Np];
8893e519524SHoward Hinnant
8903e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
891c003db1fSHoward Hinnant        {return static_cast<difference_type>(_Np * __bits_per_word);}
8923e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
8933ec1f00bSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator begin()
8943ec1f00bSHoward Hinnant    {
8953ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
8963ec1f00bSHoward Hinnant    }
8973ec1f00bSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator end()
8983ec1f00bSHoward Hinnant    {
8993ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
9003ec1f00bSHoward Hinnant                                                  static_cast<unsigned>(__size_ % __bits_per_word));
9013ec1f00bSHoward Hinnant    }
9023e519524SHoward Hinnant};
9033e519524SHoward Hinnant
904c003db1fSHoward Hinnanttemplate <class _Cp>
905c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
906c003db1fSHoward Hinnantrotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last)
9073e519524SHoward Hinnant{
908c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _I1;
9093e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
9103e519524SHoward Hinnant    difference_type __d1 = __middle - __first;
9113e519524SHoward Hinnant    difference_type __d2 = __last - __middle;
9123e519524SHoward Hinnant    _I1 __r = __first + __d2;
9133e519524SHoward Hinnant    while (__d1 != 0 && __d2 != 0)
9143e519524SHoward Hinnant    {
9153e519524SHoward Hinnant        if (__d1 <= __d2)
9163e519524SHoward Hinnant        {
917c003db1fSHoward Hinnant            if (__d1 <= __bit_array<_Cp>::capacity())
9183e519524SHoward Hinnant            {
919c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d1);
920ce48a113SHoward Hinnant                _VSTD::copy(__first, __middle, __b.begin());
921ce48a113SHoward Hinnant                _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
9223e519524SHoward Hinnant                break;
9233e519524SHoward Hinnant            }
9243e519524SHoward Hinnant            else
9253e519524SHoward Hinnant            {
926c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
9273e519524SHoward Hinnant                __first = __middle;
9283e519524SHoward Hinnant                __middle = __mp;
9293e519524SHoward Hinnant                __d2 -= __d1;
9303e519524SHoward Hinnant            }
9313e519524SHoward Hinnant        }
9323e519524SHoward Hinnant        else
9333e519524SHoward Hinnant        {
934c003db1fSHoward Hinnant            if (__d2 <= __bit_array<_Cp>::capacity())
9353e519524SHoward Hinnant            {
936c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d2);
937ce48a113SHoward Hinnant                _VSTD::copy(__middle, __last, __b.begin());
938ce48a113SHoward Hinnant                _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last));
9393e519524SHoward Hinnant                break;
9403e519524SHoward Hinnant            }
9413e519524SHoward Hinnant            else
9423e519524SHoward Hinnant            {
943c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = __first + __d2;
944ce48a113SHoward Hinnant                _VSTD::swap_ranges(__first, __mp, __middle);
9453e519524SHoward Hinnant                __first = __mp;
9463e519524SHoward Hinnant                __d1 -= __d2;
9473e519524SHoward Hinnant            }
9483e519524SHoward Hinnant        }
9493e519524SHoward Hinnant    }
9503e519524SHoward Hinnant    return __r;
9513e519524SHoward Hinnant}
9523e519524SHoward Hinnant
9533e519524SHoward Hinnant// equal
9543e519524SHoward Hinnant
9551237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
9563e519524SHoward Hinnantbool
9571237dccaSHoward Hinnant__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
9581237dccaSHoward Hinnant                  __bit_iterator<_Cp, _IC2> __first2)
9593e519524SHoward Hinnant{
9601237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
9613e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
9623e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
963aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
9643e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
9653e519524SHoward Hinnant    if (__n > 0)
9663e519524SHoward Hinnant    {
9673e519524SHoward Hinnant        // do first word
9683e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
9693e519524SHoward Hinnant        {
9703e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first1.__ctz_;
971ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
9723e519524SHoward Hinnant            __n -= __dn;
9733e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
9743e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
9753e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __first2.__ctz_;
976ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
9773e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
9783e519524SHoward Hinnant            if (__first2.__ctz_ > __first1.__ctz_)
9794c0de496SHoward Hinnant            {
9803e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
9813e519524SHoward Hinnant                    return false;
9824c0de496SHoward Hinnant            }
9833e519524SHoward Hinnant            else
9844c0de496SHoward Hinnant            {
9853e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
9863e519524SHoward Hinnant                    return false;
9874c0de496SHoward Hinnant            }
9883e519524SHoward Hinnant            __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
9893e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_)  % __bits_per_word);
9903e519524SHoward Hinnant            __dn -= __ddn;
9913e519524SHoward Hinnant            if (__dn > 0)
9923e519524SHoward Hinnant            {
9933e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
9943e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
9953e519524SHoward Hinnant                    return false;
9963e519524SHoward Hinnant                __first2.__ctz_ = static_cast<unsigned>(__dn);
9973e519524SHoward Hinnant            }
9983e519524SHoward Hinnant            ++__first1.__seg_;
9993e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10003e519524SHoward Hinnant        }
10013e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10023e519524SHoward Hinnant        // do middle words
10033e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __first2.__ctz_;
10043e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
10053e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
10063e519524SHoward Hinnant        {
10073e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_;
10083e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10093e519524SHoward Hinnant                return false;
10103e519524SHoward Hinnant            ++__first2.__seg_;
10113e519524SHoward Hinnant            if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
10123e519524SHoward Hinnant                return false;
10133e519524SHoward Hinnant        }
10143e519524SHoward Hinnant        // do last word
10153e519524SHoward Hinnant        if (__n > 0)
10163e519524SHoward Hinnant        {
10173e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
10183e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
1019ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
10203e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
10213e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10223e519524SHoward Hinnant                return false;
10233e519524SHoward Hinnant            __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
10243e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_)  % __bits_per_word);
10253e519524SHoward Hinnant            __n -= __dn;
10263e519524SHoward Hinnant            if (__n > 0)
10273e519524SHoward Hinnant            {
10283e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
10293e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> __dn))
10303e519524SHoward Hinnant                    return false;
10313e519524SHoward Hinnant            }
10323e519524SHoward Hinnant        }
10333e519524SHoward Hinnant    }
10343e519524SHoward Hinnant    return true;
10353e519524SHoward Hinnant}
10363e519524SHoward Hinnant
10371237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
10383e519524SHoward Hinnantbool
10391237dccaSHoward Hinnant__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
10401237dccaSHoward Hinnant                __bit_iterator<_Cp, _IC2> __first2)
10413e519524SHoward Hinnant{
10421237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
10433e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
10443e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
1045aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
10463e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
10473e519524SHoward Hinnant    if (__n > 0)
10483e519524SHoward Hinnant    {
10493e519524SHoward Hinnant        // do first word
10503e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
10513e519524SHoward Hinnant        {
10523e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first1.__ctz_;
1053ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
10543e519524SHoward Hinnant            __n -= __dn;
10553e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
10563e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10573e519524SHoward Hinnant                return false;
10583e519524SHoward Hinnant            ++__first2.__seg_;
10593e519524SHoward Hinnant            ++__first1.__seg_;
10603e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10613e519524SHoward Hinnant            // __first2.__ctz_ = 0;
10623e519524SHoward Hinnant        }
10633e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10643e519524SHoward Hinnant        // __first2.__ctz_ == 0;
10653e519524SHoward Hinnant        // do middle words
10663e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
10673e519524SHoward Hinnant            if (*__first2.__seg_ != *__first1.__seg_)
10683e519524SHoward Hinnant                return false;
10693e519524SHoward Hinnant        // do last word
10703e519524SHoward Hinnant        if (__n > 0)
10713e519524SHoward Hinnant        {
10723e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
10733e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10743e519524SHoward Hinnant                return false;
10753e519524SHoward Hinnant        }
10763e519524SHoward Hinnant    }
10773e519524SHoward Hinnant    return true;
10783e519524SHoward Hinnant}
10793e519524SHoward Hinnant
1080c003db1fSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
108143d99238SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10823e519524SHoward Hinnantbool
1083c003db1fSHoward Hinnantequal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2)
10843e519524SHoward Hinnant{
10853e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
1086781c476cSArthur O'Dwyer        return _VSTD::__equal_aligned(__first1, __last1, __first2);
1087781c476cSArthur O'Dwyer    return _VSTD::__equal_unaligned(__first1, __last1, __first2);
10883e519524SHoward Hinnant}
10893e519524SHoward Hinnant
10900ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst,
10910ae9efebSHoward Hinnant          typename _Cp::__storage_type>
10923e519524SHoward Hinnantclass __bit_iterator
10933e519524SHoward Hinnant{
10943e519524SHoward Hinnantpublic:
1095c003db1fSHoward Hinnant    typedef typename _Cp::difference_type                                                          difference_type;
10963e519524SHoward Hinnant    typedef bool                                                                                  value_type;
10973e519524SHoward Hinnant    typedef __bit_iterator                                                                        pointer;
1098c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
10993e519524SHoward Hinnant    typedef random_access_iterator_tag                                                            iterator_category;
11003e519524SHoward Hinnant
11013e519524SHoward Hinnantprivate:
1102c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type                                           __storage_type;
1103c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer,
1104c003db1fSHoward Hinnant                                           typename _Cp::__storage_pointer>::type  __storage_pointer;
1105c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
11063e519524SHoward Hinnant
11073e519524SHoward Hinnant    __storage_pointer __seg_;
11083e519524SHoward Hinnant    unsigned          __ctz_;
11093e519524SHoward Hinnant
11103e519524SHoward Hinnantpublic:
111136b2a3b0SMarshall Clow    _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT
111236b2a3b0SMarshall Clow#if _LIBCPP_STD_VER > 11
111336b2a3b0SMarshall Clow    : __seg_(nullptr), __ctz_(0)
111436b2a3b0SMarshall Clow#endif
111536b2a3b0SMarshall Clow    {}
11163e519524SHoward Hinnant
1117f97936faSEric Fiselier    // avoid re-declaring a copy constructor for the non-const version.
1118f97936faSEric Fiselier    using __type_for_copy_to_const =
1119f97936faSEric Fiselier      _If<_IsConst, __bit_iterator<_Cp, false>, struct __private_nat>;
1120f97936faSEric Fiselier
1121d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1122f97936faSEric Fiselier    __bit_iterator(const __type_for_copy_to_const& __it) _NOEXCEPT
11233e519524SHoward Hinnant        : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
11243e519524SHoward Hinnant
1125a829443cSEric Fiselier    // The non-const __bit_iterator has historically had a non-trivial
1126a829443cSEric Fiselier    // copy constructor (as a quirk of its construction). We need to maintain
1127a829443cSEric Fiselier    // this for ABI purposes.
1128a829443cSEric Fiselier    using __type_for_abi_non_trivial_copy_ctor =
1129a829443cSEric Fiselier      _If<!_IsConst, __bit_iterator, struct __private_nat>;
1130a829443cSEric Fiselier
1131a829443cSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1132a829443cSEric Fiselier    __bit_iterator(__type_for_abi_non_trivial_copy_ctor const& __it) _NOEXCEPT
1133a829443cSEric Fiselier      : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
1134a829443cSEric Fiselier
1135a829443cSEric Fiselier    // Always declare the copy assignment operator since the implicit declaration
1136a829443cSEric Fiselier    // is deprecated.
1137a829443cSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1138a829443cSEric Fiselier    __bit_iterator& operator=(__bit_iterator const&) = default;
1139a829443cSEric Fiselier
1140d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
1141d368a84cSHoward Hinnant        {return reference(__seg_, __storage_type(1) << __ctz_);}
11423e519524SHoward Hinnant
11433e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
11443e519524SHoward Hinnant    {
11453e519524SHoward Hinnant        if (__ctz_ != __bits_per_word-1)
11463e519524SHoward Hinnant            ++__ctz_;
11473e519524SHoward Hinnant        else
11483e519524SHoward Hinnant        {
11493e519524SHoward Hinnant            __ctz_ = 0;
11503e519524SHoward Hinnant            ++__seg_;
11513e519524SHoward Hinnant        }
11523e519524SHoward Hinnant        return *this;
11533e519524SHoward Hinnant    }
11543e519524SHoward Hinnant
11553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int)
11563e519524SHoward Hinnant    {
11573e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11583e519524SHoward Hinnant        ++(*this);
11593e519524SHoward Hinnant        return __tmp;
11603e519524SHoward Hinnant    }
11613e519524SHoward Hinnant
11623e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--()
11633e519524SHoward Hinnant    {
11643e519524SHoward Hinnant        if (__ctz_ != 0)
11653e519524SHoward Hinnant            --__ctz_;
11663e519524SHoward Hinnant        else
11673e519524SHoward Hinnant        {
11683e519524SHoward Hinnant            __ctz_ = __bits_per_word - 1;
11693e519524SHoward Hinnant            --__seg_;
11703e519524SHoward Hinnant        }
11713e519524SHoward Hinnant        return *this;
11723e519524SHoward Hinnant    }
11733e519524SHoward Hinnant
11743e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int)
11753e519524SHoward Hinnant    {
11763e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11773e519524SHoward Hinnant        --(*this);
11783e519524SHoward Hinnant        return __tmp;
11793e519524SHoward Hinnant    }
11803e519524SHoward Hinnant
11813e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n)
11823e519524SHoward Hinnant    {
11833e519524SHoward Hinnant        if (__n >= 0)
11843e519524SHoward Hinnant            __seg_ += (__n + __ctz_) / __bits_per_word;
11853e519524SHoward Hinnant        else
11863e519524SHoward Hinnant            __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
11873e519524SHoward Hinnant                    / static_cast<difference_type>(__bits_per_word);
11883e519524SHoward Hinnant        __n &= (__bits_per_word - 1);
11893e519524SHoward Hinnant        __ctz_ = static_cast<unsigned>((__n + __ctz_)  % __bits_per_word);
11903e519524SHoward Hinnant        return *this;
11913e519524SHoward Hinnant    }
11923e519524SHoward Hinnant
11933e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n)
11943e519524SHoward Hinnant    {
11953e519524SHoward Hinnant        return *this += -__n;
11963e519524SHoward Hinnant    }
11973e519524SHoward Hinnant
11983e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const
11993e519524SHoward Hinnant    {
12003e519524SHoward Hinnant        __bit_iterator __t(*this);
12013e519524SHoward Hinnant        __t += __n;
12023e519524SHoward Hinnant        return __t;
12033e519524SHoward Hinnant    }
12043e519524SHoward Hinnant
12053e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const
12063e519524SHoward Hinnant    {
12073e519524SHoward Hinnant        __bit_iterator __t(*this);
12083e519524SHoward Hinnant        __t -= __n;
12093e519524SHoward Hinnant        return __t;
12103e519524SHoward Hinnant    }
12113e519524SHoward Hinnant
12123e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12133e519524SHoward Hinnant    friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
12143e519524SHoward Hinnant
12153e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12163e519524SHoward Hinnant    friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
12173e519524SHoward Hinnant        {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
12183e519524SHoward Hinnant
12193e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);}
12203e519524SHoward Hinnant
12213e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
12223e519524SHoward Hinnant        {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
12233e519524SHoward Hinnant
12243e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
12253e519524SHoward Hinnant        {return !(__x == __y);}
12263e519524SHoward Hinnant
12273e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
12283e519524SHoward Hinnant        {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
12293e519524SHoward Hinnant
12303e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
12313e519524SHoward Hinnant        {return __y < __x;}
12323e519524SHoward Hinnant
12333e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
12343e519524SHoward Hinnant        {return !(__y < __x);}
12353e519524SHoward Hinnant
12363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
12373e519524SHoward Hinnant        {return !(__x < __y);}
12383e519524SHoward Hinnant
12393e519524SHoward Hinnantprivate:
12403e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1241d368a84cSHoward Hinnant    __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
1242d368a84cSHoward Hinnant        : __seg_(__s), __ctz_(__ctz) {}
12433e519524SHoward Hinnant
1244c003db1fSHoward Hinnant    friend typename _Cp::__self;
1245541f9e28SEric Fiselier
1246c003db1fSHoward Hinnant    friend class __bit_reference<_Cp>;
1247c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
1248c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1249c003db1fSHoward Hinnant    template <class _Dp> friend struct __bit_array;
1250c003db1fSHoward Hinnant    template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1251c003db1fSHoward Hinnant    template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1252c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first,
1253c003db1fSHoward Hinnant                                                                                  __bit_iterator<_Dp, _IC> __last,
1254c003db1fSHoward Hinnant                                                                                  __bit_iterator<_Dp, false> __result);
1255c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first,
1256c003db1fSHoward Hinnant                                                                                    __bit_iterator<_Dp, _IC> __last,
1257c003db1fSHoward Hinnant                                                                                    __bit_iterator<_Dp, false> __result);
1258c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first,
1259c003db1fSHoward Hinnant                                                                        __bit_iterator<_Dp, _IC> __last,
1260c003db1fSHoward Hinnant                                                                        __bit_iterator<_Dp, false> __result);
1261c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first,
1262c003db1fSHoward Hinnant                                                                                           __bit_iterator<_Dp, _IC> __last,
1263c003db1fSHoward Hinnant                                                                                           __bit_iterator<_Dp, false> __result);
1264c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first,
1265c003db1fSHoward Hinnant                                                                                             __bit_iterator<_Dp, _IC> __last,
1266c003db1fSHoward Hinnant                                                                                             __bit_iterator<_Dp, false> __result);
1267c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first,
1268c003db1fSHoward Hinnant                                                                                 __bit_iterator<_Dp, _IC> __last,
1269c003db1fSHoward Hinnant                                                                                 __bit_iterator<_Dp, false> __result);
1270dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>,
1271dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C1, false>,
1272dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C2, false>);
1273dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>,
1274dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C1, false>,
1275dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C2, false>);
1276dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>,
1277dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C1, false>,
1278dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C2, false>);
1279c003db1fSHoward Hinnant    template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>,
1280c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, false>,
1281c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, false>);
12821237dccaSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>,
12831237dccaSHoward Hinnant                                                    __bit_iterator<_Dp, _IC1>,
12841237dccaSHoward Hinnant                                                    __bit_iterator<_Dp, _IC2>);
12851237dccaSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>,
12861237dccaSHoward Hinnant                                                      __bit_iterator<_Dp, _IC1>,
12871237dccaSHoward Hinnant                                                      __bit_iterator<_Dp, _IC2>);
1288c003db1fSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>,
1289c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, _IC1>,
1290c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, _IC2>);
1291423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>,
1292c003db1fSHoward Hinnant                                                                          typename _Dp::size_type);
1293423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>,
1294c003db1fSHoward Hinnant                                                                           typename _Dp::size_type);
1295423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1296423a8d77SHoward Hinnant                   __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
1297423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1298423a8d77SHoward Hinnant                   __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
12993e519524SHoward Hinnant};
13003e519524SHoward Hinnant
13013e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
13023e519524SHoward Hinnant
1303a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1304a016efb1SEric Fiselier
13053e519524SHoward Hinnant#endif  // _LIBCPP___BIT_REFERENCE
1306