13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP___BIT_REFERENCE
123e519524SHoward Hinnant#define _LIBCPP___BIT_REFERENCE
133e519524SHoward Hinnant
143e519524SHoward Hinnant#include <__config>
153e519524SHoward Hinnant#include <algorithm>
163e519524SHoward Hinnant
17ab4f4382SHoward Hinnant#include <__undef_min_max>
18ab4f4382SHoward Hinnant
19073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
203e519524SHoward Hinnant#pragma GCC system_header
21073458b1SHoward Hinnant#endif
223e519524SHoward Hinnant
233e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
243e519524SHoward Hinnant
250ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
26c003db1fSHoward Hinnanttemplate <class _Cp> class __bit_const_reference;
273e519524SHoward Hinnant
28a7744562SHoward Hinnanttemplate <class _Tp>
29a7744562SHoward Hinnantstruct __has_storage_type
30a7744562SHoward Hinnant{
31a7744562SHoward Hinnant    static const bool value = false;
32a7744562SHoward Hinnant};
33a7744562SHoward Hinnant
34c003db1fSHoward Hinnanttemplate <class _Cp, bool = __has_storage_type<_Cp>::value>
353e519524SHoward Hinnantclass __bit_reference
363e519524SHoward Hinnant{
37c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type    __storage_type;
38c003db1fSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
393e519524SHoward Hinnant
403e519524SHoward Hinnant    __storage_pointer __seg_;
413e519524SHoward Hinnant    __storage_type    __mask_;
423e519524SHoward Hinnant
43d8cfc7dcSMarshall Clow#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
44c003db1fSHoward Hinnant    friend typename _Cp::__self;
453e519524SHoward Hinnant#else
46c003db1fSHoward Hinnant    friend class _Cp::__self;
473e519524SHoward Hinnant#endif
48c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
49c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, false>;
503e519524SHoward Hinnantpublic:
51d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT
52d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
53d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT
54d368a84cSHoward Hinnant        {return !static_cast<bool>(*this);}
553e519524SHoward Hinnant
563e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
57d368a84cSHoward Hinnant    __bit_reference& operator=(bool __x) _NOEXCEPT
583e519524SHoward Hinnant    {
593e519524SHoward Hinnant        if (__x)
603e519524SHoward Hinnant            *__seg_ |= __mask_;
613e519524SHoward Hinnant        else
623e519524SHoward Hinnant            *__seg_ &= ~__mask_;
633e519524SHoward Hinnant        return *this;
643e519524SHoward Hinnant    }
653e519524SHoward Hinnant
663e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
67d368a84cSHoward Hinnant    __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT
68d368a84cSHoward Hinnant        {return operator=(static_cast<bool>(__x));}
693e519524SHoward Hinnant
70d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;}
71c003db1fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT
72c003db1fSHoward Hinnant        {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
733e519524SHoward Hinnantprivate:
743e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
75d368a84cSHoward Hinnant    __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
76d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
773e519524SHoward Hinnant};
783e519524SHoward Hinnant
79c003db1fSHoward Hinnanttemplate <class _Cp>
80c003db1fSHoward Hinnantclass __bit_reference<_Cp, false>
81a7744562SHoward Hinnant{
82a7744562SHoward Hinnant};
83a7744562SHoward Hinnant
84d9db9f90SHoward Hinnanttemplate <class _Cp>
853af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
86d9db9f90SHoward Hinnantvoid
87d9db9f90SHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
88d9db9f90SHoward Hinnant{
89d9db9f90SHoward Hinnant    bool __t = __x;
90d9db9f90SHoward Hinnant    __x = __y;
91d9db9f90SHoward Hinnant    __y = __t;
92d9db9f90SHoward Hinnant}
93d9db9f90SHoward Hinnant
94c003db1fSHoward Hinnanttemplate <class _Cp, class _Dp>
953af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
963e519524SHoward Hinnantvoid
97c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
983e519524SHoward Hinnant{
993e519524SHoward Hinnant    bool __t = __x;
1003e519524SHoward Hinnant    __x = __y;
1013e519524SHoward Hinnant    __y = __t;
1023e519524SHoward Hinnant}
1033e519524SHoward Hinnant
104c003db1fSHoward Hinnanttemplate <class _Cp>
1053af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1063e519524SHoward Hinnantvoid
107c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
1083e519524SHoward Hinnant{
1093e519524SHoward Hinnant    bool __t = __x;
1103e519524SHoward Hinnant    __x = __y;
1113e519524SHoward Hinnant    __y = __t;
1123e519524SHoward Hinnant}
1133e519524SHoward Hinnant
114c003db1fSHoward Hinnanttemplate <class _Cp>
1153af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1163e519524SHoward Hinnantvoid
117c003db1fSHoward Hinnantswap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
1183e519524SHoward Hinnant{
1193e519524SHoward Hinnant    bool __t = __x;
1203e519524SHoward Hinnant    __x = __y;
1213e519524SHoward Hinnant    __y = __t;
1223e519524SHoward Hinnant}
1233e519524SHoward Hinnant
124c003db1fSHoward Hinnanttemplate <class _Cp>
1253e519524SHoward Hinnantclass __bit_const_reference
1263e519524SHoward Hinnant{
127c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type          __storage_type;
128c003db1fSHoward Hinnant    typedef typename _Cp::__const_storage_pointer __storage_pointer;
1293e519524SHoward Hinnant
1303e519524SHoward Hinnant    __storage_pointer        __seg_;
1313e519524SHoward Hinnant    __storage_type __mask_;
1323e519524SHoward Hinnant
133d8cfc7dcSMarshall Clow#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
134c003db1fSHoward Hinnant    friend typename _Cp::__self;
1353e519524SHoward Hinnant#else
136c003db1fSHoward Hinnant    friend class _Cp::__self;
1373e519524SHoward Hinnant#endif
138c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1393e519524SHoward Hinnantpublic:
1403e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
141c003db1fSHoward Hinnant    __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
1423e519524SHoward Hinnant        : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
1433e519524SHoward Hinnant
144eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT
145d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
1463e519524SHoward Hinnant
147c003db1fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT
148c003db1fSHoward Hinnant        {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
1493e519524SHoward Hinnantprivate:
1503e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
151eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR
152d368a84cSHoward Hinnant    __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
153d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
1543e519524SHoward Hinnant
1553e519524SHoward Hinnant    __bit_const_reference& operator=(const __bit_const_reference& __x);
1563e519524SHoward Hinnant};
1573e519524SHoward Hinnant
1583e519524SHoward Hinnant// find
1593e519524SHoward Hinnant
160423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
161423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
162423a8d77SHoward Hinnant__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
1633e519524SHoward Hinnant{
164423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
1653e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
166*aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
1673e519524SHoward Hinnant    // do first partial word
1683e519524SHoward Hinnant    if (__first.__ctz_ != 0)
1693e519524SHoward Hinnant    {
1703e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
171ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
1723e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
1733e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1743e519524SHoward Hinnant        if (__b)
175ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
176303e27d8SHoward Hinnant        if (__n == __dn)
1770fc6e981SMarshall Clow            return __first + __n;
1783e519524SHoward Hinnant        __n -= __dn;
1793e519524SHoward Hinnant        ++__first.__seg_;
1803e519524SHoward Hinnant    }
1813e519524SHoward Hinnant    // do middle whole words
1823e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
1833e519524SHoward Hinnant        if (*__first.__seg_)
184ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(*__first.__seg_)));
1853e519524SHoward Hinnant    // do last partial word
1863e519524SHoward Hinnant    if (__n > 0)
1873e519524SHoward Hinnant    {
1883e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
1893e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1903e519524SHoward Hinnant        if (__b)
191ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
1923e519524SHoward Hinnant    }
1933e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
1943e519524SHoward Hinnant}
1953e519524SHoward Hinnant
196423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
197423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
198423a8d77SHoward Hinnant__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
1993e519524SHoward Hinnant{
200423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2013e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
202*aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2033e519524SHoward Hinnant    // do first partial word
2043e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2053e519524SHoward Hinnant    {
2063e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
207ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2083e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
209423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2103e519524SHoward Hinnant        if (__b)
211ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
212303e27d8SHoward Hinnant        if (__n == __dn)
2130fc6e981SMarshall Clow            return __first + __n;
2143e519524SHoward Hinnant        __n -= __dn;
2153e519524SHoward Hinnant        ++__first.__seg_;
2163e519524SHoward Hinnant    }
2173e519524SHoward Hinnant    // do middle whole words
2183e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2193e519524SHoward Hinnant    {
2203e519524SHoward Hinnant        __storage_type __b = ~*__first.__seg_;
2213e519524SHoward Hinnant        if (__b)
222ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
2233e519524SHoward Hinnant    }
2243e519524SHoward Hinnant    // do last partial word
2253e519524SHoward Hinnant    if (__n > 0)
2263e519524SHoward Hinnant    {
2273e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
228423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2293e519524SHoward Hinnant        if (__b)
230ce48a113SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
2313e519524SHoward Hinnant    }
2323e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
2333e519524SHoward Hinnant}
2343e519524SHoward Hinnant
235423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
2363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
237423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
238423a8d77SHoward Hinnantfind(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
2393e519524SHoward Hinnant{
240e4383379SHoward Hinnant    if (static_cast<bool>(__value_))
241c003db1fSHoward Hinnant        return __find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
242c003db1fSHoward Hinnant    return __find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
2433e519524SHoward Hinnant}
2443e519524SHoward Hinnant
2453e519524SHoward Hinnant// count
2463e519524SHoward Hinnant
247423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
248423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
249423a8d77SHoward Hinnant__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2503e519524SHoward Hinnant{
251423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2523e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2533e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
254*aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2553e519524SHoward Hinnant    difference_type __r = 0;
2563e519524SHoward Hinnant    // do first partial word
2573e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2583e519524SHoward Hinnant    {
2593e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
260ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2613e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
262ce48a113SHoward Hinnant        __r = _VSTD::__pop_count(*__first.__seg_ & __m);
2633e519524SHoward Hinnant        __n -= __dn;
2643e519524SHoward Hinnant        ++__first.__seg_;
2653e519524SHoward Hinnant    }
2663e519524SHoward Hinnant    // do middle whole words
2673e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
268ce48a113SHoward Hinnant        __r += _VSTD::__pop_count(*__first.__seg_);
2693e519524SHoward Hinnant    // do last partial word
2703e519524SHoward Hinnant    if (__n > 0)
2713e519524SHoward Hinnant    {
2723e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
273ce48a113SHoward Hinnant        __r += _VSTD::__pop_count(*__first.__seg_ & __m);
2743e519524SHoward Hinnant    }
2753e519524SHoward Hinnant    return __r;
2763e519524SHoward Hinnant}
2773e519524SHoward Hinnant
278423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
279423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
280423a8d77SHoward Hinnant__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2813e519524SHoward Hinnant{
282423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2833e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2843e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
285*aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2863e519524SHoward Hinnant    difference_type __r = 0;
2873e519524SHoward Hinnant    // do first partial word
2883e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2893e519524SHoward Hinnant    {
2903e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
291ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2923e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
293423a8d77SHoward Hinnant        __r = _VSTD::__pop_count(~*__first.__seg_ & __m);
2943e519524SHoward Hinnant        __n -= __dn;
2953e519524SHoward Hinnant        ++__first.__seg_;
2963e519524SHoward Hinnant    }
2973e519524SHoward Hinnant    // do middle whole words
2983e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
299ce48a113SHoward Hinnant        __r += _VSTD::__pop_count(~*__first.__seg_);
3003e519524SHoward Hinnant    // do last partial word
3013e519524SHoward Hinnant    if (__n > 0)
3023e519524SHoward Hinnant    {
3033e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
304423a8d77SHoward Hinnant        __r += _VSTD::__pop_count(~*__first.__seg_ & __m);
3053e519524SHoward Hinnant    }
3063e519524SHoward Hinnant    return __r;
3073e519524SHoward Hinnant}
3083e519524SHoward Hinnant
309423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
3103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
311423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
312423a8d77SHoward Hinnantcount(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
3133e519524SHoward Hinnant{
314e4383379SHoward Hinnant    if (static_cast<bool>(__value_))
315c003db1fSHoward Hinnant        return __count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
316c003db1fSHoward Hinnant    return __count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
3173e519524SHoward Hinnant}
3183e519524SHoward Hinnant
3193e519524SHoward Hinnant// fill_n
3203e519524SHoward Hinnant
321c003db1fSHoward Hinnanttemplate <class _Cp>
3223e519524SHoward Hinnantvoid
323c003db1fSHoward Hinnant__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3243e519524SHoward Hinnant{
325c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3263e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
327*aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3283e519524SHoward Hinnant    // do first partial word
3293e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3303e519524SHoward Hinnant    {
3313e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
332ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3333e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3343e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3353e519524SHoward Hinnant        __n -= __dn;
3363e519524SHoward Hinnant        ++__first.__seg_;
3373e519524SHoward Hinnant    }
3383e519524SHoward Hinnant    // do middle whole words
3393e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3403ec1f00bSHoward Hinnant    _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), 0, __nw * sizeof(__storage_type));
3413e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3423e519524SHoward Hinnant    // do last partial word
3433e519524SHoward Hinnant    if (__n > 0)
3443e519524SHoward Hinnant    {
3453e519524SHoward Hinnant        __first.__seg_ += __nw;
3463e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3473e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3483e519524SHoward Hinnant    }
3493e519524SHoward Hinnant}
3503e519524SHoward Hinnant
351c003db1fSHoward Hinnanttemplate <class _Cp>
3523e519524SHoward Hinnantvoid
353c003db1fSHoward Hinnant__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3543e519524SHoward Hinnant{
355c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3563e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
357*aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3583e519524SHoward Hinnant    // do first partial word
3593e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3603e519524SHoward Hinnant    {
3613e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
362ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3633e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3643e519524SHoward Hinnant        *__first.__seg_ |= __m;
3653e519524SHoward Hinnant        __n -= __dn;
3663e519524SHoward Hinnant        ++__first.__seg_;
3673e519524SHoward Hinnant    }
3683e519524SHoward Hinnant    // do middle whole words
3693e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3703ec1f00bSHoward Hinnant    _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), -1, __nw * sizeof(__storage_type));
3713e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3723e519524SHoward Hinnant    // do last partial word
3733e519524SHoward Hinnant    if (__n > 0)
3743e519524SHoward Hinnant    {
3753e519524SHoward Hinnant        __first.__seg_ += __nw;
3763e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3773e519524SHoward Hinnant        *__first.__seg_ |= __m;
3783e519524SHoward Hinnant    }
3793e519524SHoward Hinnant}
3803e519524SHoward Hinnant
381c003db1fSHoward Hinnanttemplate <class _Cp>
3823af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3833e519524SHoward Hinnantvoid
384c003db1fSHoward Hinnantfill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_)
3853e519524SHoward Hinnant{
3863e519524SHoward Hinnant    if (__n > 0)
3873e519524SHoward Hinnant    {
388e4383379SHoward Hinnant        if (__value_)
3893e519524SHoward Hinnant            __fill_n_true(__first, __n);
3903e519524SHoward Hinnant        else
3913e519524SHoward Hinnant            __fill_n_false(__first, __n);
3923e519524SHoward Hinnant    }
3933e519524SHoward Hinnant}
3943e519524SHoward Hinnant
3953e519524SHoward Hinnant// fill
3963e519524SHoward Hinnant
397c003db1fSHoward Hinnanttemplate <class _Cp>
3983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3993e519524SHoward Hinnantvoid
400c003db1fSHoward Hinnantfill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_)
4013e519524SHoward Hinnant{
402c003db1fSHoward Hinnant    _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_);
4033e519524SHoward Hinnant}
4043e519524SHoward Hinnant
4053e519524SHoward Hinnant// copy
4063e519524SHoward Hinnant
407c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
408c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
409c003db1fSHoward Hinnant__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
410c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
4113e519524SHoward Hinnant{
412c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4133e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4143e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
415*aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
4163e519524SHoward Hinnant    difference_type __n = __last - __first;
4173e519524SHoward Hinnant    if (__n > 0)
4183e519524SHoward Hinnant    {
4193e519524SHoward Hinnant        // do first word
4203e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4213e519524SHoward Hinnant        {
4223e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
423ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
4243e519524SHoward Hinnant            __n -= __dn;
4253e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
4263e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4273e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4283e519524SHoward Hinnant            *__result.__seg_ |= __b;
4293e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
4303e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
4313e519524SHoward Hinnant            ++__first.__seg_;
4323e519524SHoward Hinnant            // __first.__ctz_ = 0;
4333e519524SHoward Hinnant        }
4343e519524SHoward Hinnant        // __first.__ctz_ == 0;
4353e519524SHoward Hinnant        // do middle words
4363e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
4373ec1f00bSHoward Hinnant        _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
4383ec1f00bSHoward Hinnant                       _VSTD::__to_raw_pointer(__first.__seg_),
4393ec1f00bSHoward Hinnant                       __nw * sizeof(__storage_type));
4403e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
4413e519524SHoward Hinnant        __result.__seg_ += __nw;
4423e519524SHoward Hinnant        // do last word
4433e519524SHoward Hinnant        if (__n > 0)
4443e519524SHoward Hinnant        {
4453e519524SHoward Hinnant            __first.__seg_ += __nw;
4463e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4473e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4483e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4493e519524SHoward Hinnant            *__result.__seg_ |= __b;
4503e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
4513e519524SHoward Hinnant        }
4523e519524SHoward Hinnant    }
4533e519524SHoward Hinnant    return __result;
4543e519524SHoward Hinnant}
4553e519524SHoward Hinnant
456c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
457c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
458c003db1fSHoward Hinnant__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
459c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
4603e519524SHoward Hinnant{
461c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4623e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4633e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
464*aec08784SEric Fiselier    static const int __bits_per_word = _In::__bits_per_word;
4653e519524SHoward Hinnant    difference_type __n = __last - __first;
4663e519524SHoward Hinnant    if (__n > 0)
4673e519524SHoward Hinnant    {
4683e519524SHoward Hinnant        // do first word
4693e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4703e519524SHoward Hinnant        {
4713e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
472ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
4733e519524SHoward Hinnant            __n -= __dn;
4743e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
4753e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4763e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
477ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
4783e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
4793e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4803e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
4813e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
4823e519524SHoward Hinnant            else
4833e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
4843e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
4853e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
4863e519524SHoward Hinnant            __dn -= __ddn;
4873e519524SHoward Hinnant            if (__dn > 0)
4883e519524SHoward Hinnant            {
4893e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
4903e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
4913e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
4923e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
4933e519524SHoward Hinnant            }
4943e519524SHoward Hinnant            ++__first.__seg_;
4953e519524SHoward Hinnant            // __first.__ctz_ = 0;
4963e519524SHoward Hinnant        }
4973e519524SHoward Hinnant        // __first.__ctz_ == 0;
4983e519524SHoward Hinnant        // do middle words
4993e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
5003e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
5013e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
5023e519524SHoward Hinnant        {
5033e519524SHoward Hinnant            __storage_type __b = *__first.__seg_;
5043e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5053e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5063e519524SHoward Hinnant            ++__result.__seg_;
5073e519524SHoward Hinnant            *__result.__seg_ &= __m;
5083e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
5093e519524SHoward Hinnant        }
5103e519524SHoward Hinnant        // do last word
5113e519524SHoward Hinnant        if (__n > 0)
5123e519524SHoward Hinnant        {
5133e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
5143e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
515ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
5163e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
5173e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5183e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5193e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
5203e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
5213e519524SHoward Hinnant            __n -= __dn;
5223e519524SHoward Hinnant            if (__n > 0)
5233e519524SHoward Hinnant            {
5243e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
5253e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5263e519524SHoward Hinnant                *__result.__seg_ |= __b >> __dn;
5273e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
5283e519524SHoward Hinnant            }
5293e519524SHoward Hinnant        }
5303e519524SHoward Hinnant    }
5313e519524SHoward Hinnant    return __result;
5323e519524SHoward Hinnant}
5333e519524SHoward Hinnant
534c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
5353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
536c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
537c003db1fSHoward Hinnantcopy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
5383e519524SHoward Hinnant{
5393e519524SHoward Hinnant    if (__first.__ctz_ == __result.__ctz_)
5403e519524SHoward Hinnant        return __copy_aligned(__first, __last, __result);
5413e519524SHoward Hinnant    return __copy_unaligned(__first, __last, __result);
5423e519524SHoward Hinnant}
5433e519524SHoward Hinnant
5443e519524SHoward Hinnant// copy_backward
5453e519524SHoward Hinnant
546c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
547c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
548c003db1fSHoward Hinnant__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
549c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
5503e519524SHoward Hinnant{
551c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
5523e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
5533e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
554*aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
5553e519524SHoward Hinnant    difference_type __n = __last - __first;
5563e519524SHoward Hinnant    if (__n > 0)
5573e519524SHoward Hinnant    {
5583e519524SHoward Hinnant        // do first word
5593e519524SHoward Hinnant        if (__last.__ctz_ != 0)
5603e519524SHoward Hinnant        {
561ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
5623e519524SHoward Hinnant            __n -= __dn;
5633e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __last.__ctz_;
5643e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
5653e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
5663e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5673e519524SHoward Hinnant            *__result.__seg_ |= __b;
5683e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
5693e519524SHoward Hinnant                                                       __result.__ctz_)  % __bits_per_word);
5703e519524SHoward Hinnant            // __last.__ctz_ = 0
5713e519524SHoward Hinnant         }
5723e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
5733e519524SHoward Hinnant        // __result.__ctz_ == 0 || __n == 0
5743e519524SHoward Hinnant        // do middle words
5753e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
5763e519524SHoward Hinnant        __result.__seg_ -= __nw;
5773e519524SHoward Hinnant        __last.__seg_ -= __nw;
5783ec1f00bSHoward Hinnant        _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
5793ec1f00bSHoward Hinnant                       _VSTD::__to_raw_pointer(__last.__seg_),
5803ec1f00bSHoward Hinnant                       __nw * sizeof(__storage_type));
5813e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
5823e519524SHoward Hinnant        // do last word
5833e519524SHoward Hinnant        if (__n > 0)
5843e519524SHoward Hinnant        {
5853e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
5863e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
5873e519524SHoward Hinnant            *--__result.__seg_ &= ~__m;
5883e519524SHoward Hinnant            *__result.__seg_ |= __b;
5893e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
5903e519524SHoward Hinnant        }
5913e519524SHoward Hinnant    }
5923e519524SHoward Hinnant    return __result;
5933e519524SHoward Hinnant}
5943e519524SHoward Hinnant
595c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
596c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
597c003db1fSHoward Hinnant__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
598c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
5993e519524SHoward Hinnant{
600c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
6013e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
6023e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
603*aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
6043e519524SHoward Hinnant    difference_type __n = __last - __first;
6053e519524SHoward Hinnant    if (__n > 0)
6063e519524SHoward Hinnant    {
6073e519524SHoward Hinnant        // do first word
6083e519524SHoward Hinnant        if (__last.__ctz_ != 0)
6093e519524SHoward Hinnant        {
610ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
6113e519524SHoward Hinnant            __n -= __dn;
6123e519524SHoward Hinnant            unsigned __clz_l = __bits_per_word - __last.__ctz_;
6133e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
6143e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
6153e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
616ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_));
6173e519524SHoward Hinnant            if (__ddn > 0)
6183e519524SHoward Hinnant            {
6193e519524SHoward Hinnant                __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
6203e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6213e519524SHoward Hinnant                if (__result.__ctz_ > __last.__ctz_)
6223e519524SHoward Hinnant                    *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6233e519524SHoward Hinnant                else
6243e519524SHoward Hinnant                    *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
6253e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
6263e519524SHoward Hinnant                                                         __result.__ctz_)  % __bits_per_word);
6273e519524SHoward Hinnant                __dn -= __ddn;
6283e519524SHoward Hinnant            }
6293e519524SHoward Hinnant            if (__dn > 0)
6303e519524SHoward Hinnant            {
6313e519524SHoward Hinnant                // __result.__ctz_ == 0
6323e519524SHoward Hinnant                --__result.__seg_;
6333e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
6343e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6353e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6363e519524SHoward Hinnant                __last.__ctz_ -= __dn + __ddn;
6373e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6383e519524SHoward Hinnant            }
6393e519524SHoward Hinnant            // __last.__ctz_ = 0
6403e519524SHoward Hinnant         }
6413e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
6423e519524SHoward Hinnant        // __result.__ctz_ != 0 || __n == 0
6433e519524SHoward Hinnant        // do middle words
6443e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
6453e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> __clz_r;
6463e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word)
6473e519524SHoward Hinnant        {
6483e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_;
6493e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6503e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
6513e519524SHoward Hinnant            *--__result.__seg_ &= __m;
6523e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
6533e519524SHoward Hinnant        }
6543e519524SHoward Hinnant        // do last word
6553e519524SHoward Hinnant        if (__n > 0)
6563e519524SHoward Hinnant        {
6573e519524SHoward Hinnant            __m = ~__storage_type(0) << (__bits_per_word - __n);
6583e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
659c206366fSHoward Hinnant            __clz_r = __bits_per_word - __result.__ctz_;
660ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_));
6613e519524SHoward Hinnant            __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
6623e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6633e519524SHoward Hinnant            *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
6643e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
6653e519524SHoward Hinnant                                                     __result.__ctz_)  % __bits_per_word);
6663e519524SHoward Hinnant            __n -= __dn;
6673e519524SHoward Hinnant            if (__n > 0)
6683e519524SHoward Hinnant            {
6693e519524SHoward Hinnant                // __result.__ctz_ == 0
6703e519524SHoward Hinnant                --__result.__seg_;
6713e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
6723e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6733e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6743e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
6753e519524SHoward Hinnant            }
6763e519524SHoward Hinnant        }
6773e519524SHoward Hinnant    }
6783e519524SHoward Hinnant    return __result;
6793e519524SHoward Hinnant}
6803e519524SHoward Hinnant
681c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
6823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
683c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
684c003db1fSHoward Hinnantcopy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
6853e519524SHoward Hinnant{
6863e519524SHoward Hinnant    if (__last.__ctz_ == __result.__ctz_)
6873e519524SHoward Hinnant        return __copy_backward_aligned(__first, __last, __result);
6883e519524SHoward Hinnant    return __copy_backward_unaligned(__first, __last, __result);
6893e519524SHoward Hinnant}
6903e519524SHoward Hinnant
6913e519524SHoward Hinnant// move
6923e519524SHoward Hinnant
693c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
6943e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
695c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
696c003db1fSHoward Hinnantmove(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
6973e519524SHoward Hinnant{
698ce48a113SHoward Hinnant    return _VSTD::copy(__first, __last, __result);
6993e519524SHoward Hinnant}
7003e519524SHoward Hinnant
7013e519524SHoward Hinnant// move_backward
7023e519524SHoward Hinnant
703c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
7043e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
705c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
706c003db1fSHoward Hinnantmove_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
7073e519524SHoward Hinnant{
70808de4b0dSMarshall Clow    return _VSTD::copy_backward(__first, __last, __result);
7093e519524SHoward Hinnant}
7103e519524SHoward Hinnant
7113e519524SHoward Hinnant// swap_ranges
7123e519524SHoward Hinnant
713dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
714dbe81119SHoward Hinnant__bit_iterator<__C2, false>
715dbe81119SHoward Hinnant__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
716dbe81119SHoward Hinnant                      __bit_iterator<__C2, false> __result)
7173e519524SHoward Hinnant{
718dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7193e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7203e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
721*aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7223e519524SHoward Hinnant    difference_type __n = __last - __first;
7233e519524SHoward Hinnant    if (__n > 0)
7243e519524SHoward Hinnant    {
7253e519524SHoward Hinnant        // do first word
7263e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7273e519524SHoward Hinnant        {
7283e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
729ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
7303e519524SHoward Hinnant            __n -= __dn;
7313e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
7323e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7333e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7343e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7353e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7363e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7373e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7383e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
7393e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
7403e519524SHoward Hinnant            ++__first.__seg_;
7413e519524SHoward Hinnant            // __first.__ctz_ = 0;
7423e519524SHoward Hinnant        }
7433e519524SHoward Hinnant        // __first.__ctz_ == 0;
7443e519524SHoward Hinnant        // do middle words
7453e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
7463e519524SHoward Hinnant            swap(*__first.__seg_, *__result.__seg_);
7473e519524SHoward Hinnant        // do last word
7483e519524SHoward Hinnant        if (__n > 0)
7493e519524SHoward Hinnant        {
7503e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
7513e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7523e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7533e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7543e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7553e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7563e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7573e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
7583e519524SHoward Hinnant        }
7593e519524SHoward Hinnant    }
7603e519524SHoward Hinnant    return __result;
7613e519524SHoward Hinnant}
7623e519524SHoward Hinnant
763dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
764dbe81119SHoward Hinnant__bit_iterator<__C2, false>
765dbe81119SHoward Hinnant__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
766dbe81119SHoward Hinnant                        __bit_iterator<__C2, false> __result)
7673e519524SHoward Hinnant{
768dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7693e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7703e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
771*aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7723e519524SHoward Hinnant    difference_type __n = __last - __first;
7733e519524SHoward Hinnant    if (__n > 0)
7743e519524SHoward Hinnant    {
7753e519524SHoward Hinnant        // do first word
7763e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7773e519524SHoward Hinnant        {
7783e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
779ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
7803e519524SHoward Hinnant            __n -= __dn;
7813e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
7823e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7833e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7843e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
785ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
7863e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
7873e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7883e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7893e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
7903e519524SHoward Hinnant            {
7913e519524SHoward Hinnant                unsigned __s = __result.__ctz_ - __first.__ctz_;
7923e519524SHoward Hinnant                *__result.__seg_ |= __b1 << __s;
7933e519524SHoward Hinnant                *__first.__seg_  |= __b2 >> __s;
7943e519524SHoward Hinnant            }
7953e519524SHoward Hinnant            else
7963e519524SHoward Hinnant            {
7973e519524SHoward Hinnant                unsigned __s = __first.__ctz_ - __result.__ctz_;
7983e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
7993e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8003e519524SHoward Hinnant            }
8013e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
8023e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
8033e519524SHoward Hinnant            __dn -= __ddn;
8043e519524SHoward Hinnant            if (__dn > 0)
8053e519524SHoward Hinnant            {
8063e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
8073e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8083e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8093e519524SHoward Hinnant                unsigned __s = __first.__ctz_ + __ddn;
8103e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
8113e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8123e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
8133e519524SHoward Hinnant            }
8143e519524SHoward Hinnant            ++__first.__seg_;
8153e519524SHoward Hinnant            // __first.__ctz_ = 0;
8163e519524SHoward Hinnant        }
8173e519524SHoward Hinnant        // __first.__ctz_ == 0;
8183e519524SHoward Hinnant        // do middle words
8193e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
8203e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
8213e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
8223e519524SHoward Hinnant        {
8233e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_;
8243e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8253e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8263e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8273e519524SHoward Hinnant            *__first.__seg_  = __b2 >> __result.__ctz_;
8283e519524SHoward Hinnant            ++__result.__seg_;
8293e519524SHoward Hinnant            __b2 = *__result.__seg_ & ~__m;
8303e519524SHoward Hinnant            *__result.__seg_ &= __m;
8313e519524SHoward Hinnant            *__result.__seg_ |= __b1 >> __clz_r;
8323e519524SHoward Hinnant            *__first.__seg_  |= __b2 << __clz_r;
8333e519524SHoward Hinnant        }
8343e519524SHoward Hinnant        // do last word
8353e519524SHoward Hinnant        if (__n > 0)
8363e519524SHoward Hinnant        {
8373e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
8383e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
8393e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
840ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r);
8413e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
8423e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8433e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8443e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8453e519524SHoward Hinnant            *__first.__seg_  |= __b2 >> __result.__ctz_;
8463e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
8473e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
8483e519524SHoward Hinnant            __n -= __dn;
8493e519524SHoward Hinnant            if (__n > 0)
8503e519524SHoward Hinnant            {
8513e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
8523e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8533e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8543e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __dn;
8553e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __dn;
8563e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
8573e519524SHoward Hinnant            }
8583e519524SHoward Hinnant        }
8593e519524SHoward Hinnant    }
8603e519524SHoward Hinnant    return __result;
8613e519524SHoward Hinnant}
8623e519524SHoward Hinnant
863dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
8643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
865dbe81119SHoward Hinnant__bit_iterator<__C2, false>
866dbe81119SHoward Hinnantswap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1,
867dbe81119SHoward Hinnant            __bit_iterator<__C2, false> __first2)
8683e519524SHoward Hinnant{
8693e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
8703e519524SHoward Hinnant        return __swap_ranges_aligned(__first1, __last1, __first2);
8713e519524SHoward Hinnant    return __swap_ranges_unaligned(__first1, __last1, __first2);
8723e519524SHoward Hinnant}
8733e519524SHoward Hinnant
8743e519524SHoward Hinnant// rotate
8753e519524SHoward Hinnant
876c003db1fSHoward Hinnanttemplate <class _Cp>
8773e519524SHoward Hinnantstruct __bit_array
8783e519524SHoward Hinnant{
879c003db1fSHoward Hinnant    typedef typename _Cp::difference_type difference_type;
880c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type  __storage_type;
8813ec1f00bSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
882c003db1fSHoward Hinnant    typedef typename _Cp::iterator        iterator;
883c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
884c003db1fSHoward Hinnant    static const unsigned _Np = 4;
8853e519524SHoward Hinnant
8863e519524SHoward Hinnant    difference_type __size_;
887c003db1fSHoward Hinnant    __storage_type __word_[_Np];
8883e519524SHoward Hinnant
8893e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
890c003db1fSHoward Hinnant        {return static_cast<difference_type>(_Np * __bits_per_word);}
8913e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
8923ec1f00bSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator begin()
8933ec1f00bSHoward Hinnant    {
8943ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
8953ec1f00bSHoward Hinnant    }
8963ec1f00bSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator end()
8973ec1f00bSHoward Hinnant    {
8983ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
8993ec1f00bSHoward Hinnant                                                  static_cast<unsigned>(__size_ % __bits_per_word));
9003ec1f00bSHoward Hinnant    }
9013e519524SHoward Hinnant};
9023e519524SHoward Hinnant
903c003db1fSHoward Hinnanttemplate <class _Cp>
904c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
905c003db1fSHoward Hinnantrotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last)
9063e519524SHoward Hinnant{
907c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _I1;
9083e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
9093e519524SHoward Hinnant    difference_type __d1 = __middle - __first;
9103e519524SHoward Hinnant    difference_type __d2 = __last - __middle;
9113e519524SHoward Hinnant    _I1 __r = __first + __d2;
9123e519524SHoward Hinnant    while (__d1 != 0 && __d2 != 0)
9133e519524SHoward Hinnant    {
9143e519524SHoward Hinnant        if (__d1 <= __d2)
9153e519524SHoward Hinnant        {
916c003db1fSHoward Hinnant            if (__d1 <= __bit_array<_Cp>::capacity())
9173e519524SHoward Hinnant            {
918c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d1);
919ce48a113SHoward Hinnant                _VSTD::copy(__first, __middle, __b.begin());
920ce48a113SHoward Hinnant                _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
9213e519524SHoward Hinnant                break;
9223e519524SHoward Hinnant            }
9233e519524SHoward Hinnant            else
9243e519524SHoward Hinnant            {
925c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
9263e519524SHoward Hinnant                __first = __middle;
9273e519524SHoward Hinnant                __middle = __mp;
9283e519524SHoward Hinnant                __d2 -= __d1;
9293e519524SHoward Hinnant            }
9303e519524SHoward Hinnant        }
9313e519524SHoward Hinnant        else
9323e519524SHoward Hinnant        {
933c003db1fSHoward Hinnant            if (__d2 <= __bit_array<_Cp>::capacity())
9343e519524SHoward Hinnant            {
935c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d2);
936ce48a113SHoward Hinnant                _VSTD::copy(__middle, __last, __b.begin());
937ce48a113SHoward Hinnant                _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last));
9383e519524SHoward Hinnant                break;
9393e519524SHoward Hinnant            }
9403e519524SHoward Hinnant            else
9413e519524SHoward Hinnant            {
942c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = __first + __d2;
943ce48a113SHoward Hinnant                _VSTD::swap_ranges(__first, __mp, __middle);
9443e519524SHoward Hinnant                __first = __mp;
9453e519524SHoward Hinnant                __d1 -= __d2;
9463e519524SHoward Hinnant            }
9473e519524SHoward Hinnant        }
9483e519524SHoward Hinnant    }
9493e519524SHoward Hinnant    return __r;
9503e519524SHoward Hinnant}
9513e519524SHoward Hinnant
9523e519524SHoward Hinnant// equal
9533e519524SHoward Hinnant
9541237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
9553e519524SHoward Hinnantbool
9561237dccaSHoward Hinnant__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
9571237dccaSHoward Hinnant                  __bit_iterator<_Cp, _IC2> __first2)
9583e519524SHoward Hinnant{
9591237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
9603e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
9613e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
962*aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
9633e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
9643e519524SHoward Hinnant    if (__n > 0)
9653e519524SHoward Hinnant    {
9663e519524SHoward Hinnant        // do first word
9673e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
9683e519524SHoward Hinnant        {
9693e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first1.__ctz_;
970ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
9713e519524SHoward Hinnant            __n -= __dn;
9723e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
9733e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
9743e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __first2.__ctz_;
975ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
9763e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
9773e519524SHoward Hinnant            if (__first2.__ctz_ > __first1.__ctz_)
9784c0de496SHoward Hinnant            {
9793e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
9803e519524SHoward Hinnant                    return false;
9814c0de496SHoward Hinnant            }
9823e519524SHoward Hinnant            else
9834c0de496SHoward Hinnant            {
9843e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
9853e519524SHoward Hinnant                    return false;
9864c0de496SHoward Hinnant            }
9873e519524SHoward Hinnant            __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
9883e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_)  % __bits_per_word);
9893e519524SHoward Hinnant            __dn -= __ddn;
9903e519524SHoward Hinnant            if (__dn > 0)
9913e519524SHoward Hinnant            {
9923e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
9933e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
9943e519524SHoward Hinnant                    return false;
9953e519524SHoward Hinnant                __first2.__ctz_ = static_cast<unsigned>(__dn);
9963e519524SHoward Hinnant            }
9973e519524SHoward Hinnant            ++__first1.__seg_;
9983e519524SHoward Hinnant            // __first1.__ctz_ = 0;
9993e519524SHoward Hinnant        }
10003e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10013e519524SHoward Hinnant        // do middle words
10023e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __first2.__ctz_;
10033e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
10043e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
10053e519524SHoward Hinnant        {
10063e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_;
10073e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10083e519524SHoward Hinnant                return false;
10093e519524SHoward Hinnant            ++__first2.__seg_;
10103e519524SHoward Hinnant            if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
10113e519524SHoward Hinnant                return false;
10123e519524SHoward Hinnant        }
10133e519524SHoward Hinnant        // do last word
10143e519524SHoward Hinnant        if (__n > 0)
10153e519524SHoward Hinnant        {
10163e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
10173e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
1018ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
10193e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
10203e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10213e519524SHoward Hinnant                return false;
10223e519524SHoward Hinnant            __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
10233e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_)  % __bits_per_word);
10243e519524SHoward Hinnant            __n -= __dn;
10253e519524SHoward Hinnant            if (__n > 0)
10263e519524SHoward Hinnant            {
10273e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
10283e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> __dn))
10293e519524SHoward Hinnant                    return false;
10303e519524SHoward Hinnant            }
10313e519524SHoward Hinnant        }
10323e519524SHoward Hinnant    }
10333e519524SHoward Hinnant    return true;
10343e519524SHoward Hinnant}
10353e519524SHoward Hinnant
10361237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
10373e519524SHoward Hinnantbool
10381237dccaSHoward Hinnant__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
10391237dccaSHoward Hinnant                __bit_iterator<_Cp, _IC2> __first2)
10403e519524SHoward Hinnant{
10411237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
10423e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
10433e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
1044*aec08784SEric Fiselier    static const int __bits_per_word = _It::__bits_per_word;
10453e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
10463e519524SHoward Hinnant    if (__n > 0)
10473e519524SHoward Hinnant    {
10483e519524SHoward Hinnant        // do first word
10493e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
10503e519524SHoward Hinnant        {
10513e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first1.__ctz_;
1052ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
10533e519524SHoward Hinnant            __n -= __dn;
10543e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
10553e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10563e519524SHoward Hinnant                return false;
10573e519524SHoward Hinnant            ++__first2.__seg_;
10583e519524SHoward Hinnant            ++__first1.__seg_;
10593e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10603e519524SHoward Hinnant            // __first2.__ctz_ = 0;
10613e519524SHoward Hinnant        }
10623e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10633e519524SHoward Hinnant        // __first2.__ctz_ == 0;
10643e519524SHoward Hinnant        // do middle words
10653e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
10663e519524SHoward Hinnant            if (*__first2.__seg_ != *__first1.__seg_)
10673e519524SHoward Hinnant                return false;
10683e519524SHoward Hinnant        // do last word
10693e519524SHoward Hinnant        if (__n > 0)
10703e519524SHoward Hinnant        {
10713e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
10723e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10733e519524SHoward Hinnant                return false;
10743e519524SHoward Hinnant        }
10753e519524SHoward Hinnant    }
10763e519524SHoward Hinnant    return true;
10773e519524SHoward Hinnant}
10783e519524SHoward Hinnant
1079c003db1fSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
108043d99238SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10813e519524SHoward Hinnantbool
1082c003db1fSHoward Hinnantequal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2)
10833e519524SHoward Hinnant{
10843e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
10853e519524SHoward Hinnant        return __equal_aligned(__first1, __last1, __first2);
10863e519524SHoward Hinnant    return __equal_unaligned(__first1, __last1, __first2);
10873e519524SHoward Hinnant}
10883e519524SHoward Hinnant
10890ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst,
10900ae9efebSHoward Hinnant          typename _Cp::__storage_type>
10913e519524SHoward Hinnantclass __bit_iterator
10923e519524SHoward Hinnant{
10933e519524SHoward Hinnantpublic:
1094c003db1fSHoward Hinnant    typedef typename _Cp::difference_type                                                          difference_type;
10953e519524SHoward Hinnant    typedef bool                                                                                  value_type;
10963e519524SHoward Hinnant    typedef __bit_iterator                                                                        pointer;
1097c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
10983e519524SHoward Hinnant    typedef random_access_iterator_tag                                                            iterator_category;
10993e519524SHoward Hinnant
11003e519524SHoward Hinnantprivate:
1101c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type                                           __storage_type;
1102c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer,
1103c003db1fSHoward Hinnant                                           typename _Cp::__storage_pointer>::type  __storage_pointer;
1104c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
11053e519524SHoward Hinnant
11063e519524SHoward Hinnant    __storage_pointer __seg_;
11073e519524SHoward Hinnant    unsigned          __ctz_;
11083e519524SHoward Hinnant
11093e519524SHoward Hinnantpublic:
111036b2a3b0SMarshall Clow    _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT
111136b2a3b0SMarshall Clow#if _LIBCPP_STD_VER > 11
111236b2a3b0SMarshall Clow    : __seg_(nullptr), __ctz_(0)
111336b2a3b0SMarshall Clow#endif
111436b2a3b0SMarshall Clow    {}
11153e519524SHoward Hinnant
1116d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1117c003db1fSHoward Hinnant    __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT
11183e519524SHoward Hinnant        : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
11193e519524SHoward Hinnant
1120d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
1121d368a84cSHoward Hinnant        {return reference(__seg_, __storage_type(1) << __ctz_);}
11223e519524SHoward Hinnant
11233e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
11243e519524SHoward Hinnant    {
11253e519524SHoward Hinnant        if (__ctz_ != __bits_per_word-1)
11263e519524SHoward Hinnant            ++__ctz_;
11273e519524SHoward Hinnant        else
11283e519524SHoward Hinnant        {
11293e519524SHoward Hinnant            __ctz_ = 0;
11303e519524SHoward Hinnant            ++__seg_;
11313e519524SHoward Hinnant        }
11323e519524SHoward Hinnant        return *this;
11333e519524SHoward Hinnant    }
11343e519524SHoward Hinnant
11353e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int)
11363e519524SHoward Hinnant    {
11373e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11383e519524SHoward Hinnant        ++(*this);
11393e519524SHoward Hinnant        return __tmp;
11403e519524SHoward Hinnant    }
11413e519524SHoward Hinnant
11423e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--()
11433e519524SHoward Hinnant    {
11443e519524SHoward Hinnant        if (__ctz_ != 0)
11453e519524SHoward Hinnant            --__ctz_;
11463e519524SHoward Hinnant        else
11473e519524SHoward Hinnant        {
11483e519524SHoward Hinnant            __ctz_ = __bits_per_word - 1;
11493e519524SHoward Hinnant            --__seg_;
11503e519524SHoward Hinnant        }
11513e519524SHoward Hinnant        return *this;
11523e519524SHoward Hinnant    }
11533e519524SHoward Hinnant
11543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int)
11553e519524SHoward Hinnant    {
11563e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11573e519524SHoward Hinnant        --(*this);
11583e519524SHoward Hinnant        return __tmp;
11593e519524SHoward Hinnant    }
11603e519524SHoward Hinnant
11613e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n)
11623e519524SHoward Hinnant    {
11633e519524SHoward Hinnant        if (__n >= 0)
11643e519524SHoward Hinnant            __seg_ += (__n + __ctz_) / __bits_per_word;
11653e519524SHoward Hinnant        else
11663e519524SHoward Hinnant            __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
11673e519524SHoward Hinnant                    / static_cast<difference_type>(__bits_per_word);
11683e519524SHoward Hinnant        __n &= (__bits_per_word - 1);
11693e519524SHoward Hinnant        __ctz_ = static_cast<unsigned>((__n + __ctz_)  % __bits_per_word);
11703e519524SHoward Hinnant        return *this;
11713e519524SHoward Hinnant    }
11723e519524SHoward Hinnant
11733e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n)
11743e519524SHoward Hinnant    {
11753e519524SHoward Hinnant        return *this += -__n;
11763e519524SHoward Hinnant    }
11773e519524SHoward Hinnant
11783e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const
11793e519524SHoward Hinnant    {
11803e519524SHoward Hinnant        __bit_iterator __t(*this);
11813e519524SHoward Hinnant        __t += __n;
11823e519524SHoward Hinnant        return __t;
11833e519524SHoward Hinnant    }
11843e519524SHoward Hinnant
11853e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const
11863e519524SHoward Hinnant    {
11873e519524SHoward Hinnant        __bit_iterator __t(*this);
11883e519524SHoward Hinnant        __t -= __n;
11893e519524SHoward Hinnant        return __t;
11903e519524SHoward Hinnant    }
11913e519524SHoward Hinnant
11923e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11933e519524SHoward Hinnant    friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
11943e519524SHoward Hinnant
11953e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11963e519524SHoward Hinnant    friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
11973e519524SHoward Hinnant        {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
11983e519524SHoward Hinnant
11993e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);}
12003e519524SHoward Hinnant
12013e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
12023e519524SHoward Hinnant        {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
12033e519524SHoward Hinnant
12043e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
12053e519524SHoward Hinnant        {return !(__x == __y);}
12063e519524SHoward Hinnant
12073e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
12083e519524SHoward Hinnant        {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
12093e519524SHoward Hinnant
12103e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
12113e519524SHoward Hinnant        {return __y < __x;}
12123e519524SHoward Hinnant
12133e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
12143e519524SHoward Hinnant        {return !(__y < __x);}
12153e519524SHoward Hinnant
12163e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
12173e519524SHoward Hinnant        {return !(__x < __y);}
12183e519524SHoward Hinnant
12193e519524SHoward Hinnantprivate:
12203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1221d368a84cSHoward Hinnant    __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
1222d368a84cSHoward Hinnant        : __seg_(__s), __ctz_(__ctz) {}
12233e519524SHoward Hinnant
1224d8cfc7dcSMarshall Clow#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
1225c003db1fSHoward Hinnant    friend typename _Cp::__self;
12263e519524SHoward Hinnant#else
1227c003db1fSHoward Hinnant    friend class _Cp::__self;
12283e519524SHoward Hinnant#endif
1229c003db1fSHoward Hinnant    friend class __bit_reference<_Cp>;
1230c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
1231c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1232c003db1fSHoward Hinnant    template <class _Dp> friend struct __bit_array;
1233c003db1fSHoward Hinnant    template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1234c003db1fSHoward Hinnant    template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1235c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first,
1236c003db1fSHoward Hinnant                                                                                  __bit_iterator<_Dp, _IC> __last,
1237c003db1fSHoward Hinnant                                                                                  __bit_iterator<_Dp, false> __result);
1238c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first,
1239c003db1fSHoward Hinnant                                                                                    __bit_iterator<_Dp, _IC> __last,
1240c003db1fSHoward Hinnant                                                                                    __bit_iterator<_Dp, false> __result);
1241c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first,
1242c003db1fSHoward Hinnant                                                                        __bit_iterator<_Dp, _IC> __last,
1243c003db1fSHoward Hinnant                                                                        __bit_iterator<_Dp, false> __result);
1244c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first,
1245c003db1fSHoward Hinnant                                                                                           __bit_iterator<_Dp, _IC> __last,
1246c003db1fSHoward Hinnant                                                                                           __bit_iterator<_Dp, false> __result);
1247c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first,
1248c003db1fSHoward Hinnant                                                                                             __bit_iterator<_Dp, _IC> __last,
1249c003db1fSHoward Hinnant                                                                                             __bit_iterator<_Dp, false> __result);
1250c003db1fSHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first,
1251c003db1fSHoward Hinnant                                                                                 __bit_iterator<_Dp, _IC> __last,
1252c003db1fSHoward Hinnant                                                                                 __bit_iterator<_Dp, false> __result);
1253dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>,
1254dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C1, false>,
1255dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C2, false>);
1256dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>,
1257dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C1, false>,
1258dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C2, false>);
1259dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>,
1260dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C1, false>,
1261dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C2, false>);
1262c003db1fSHoward Hinnant    template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>,
1263c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, false>,
1264c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, false>);
12651237dccaSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>,
12661237dccaSHoward Hinnant                                                    __bit_iterator<_Dp, _IC1>,
12671237dccaSHoward Hinnant                                                    __bit_iterator<_Dp, _IC2>);
12681237dccaSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>,
12691237dccaSHoward Hinnant                                                      __bit_iterator<_Dp, _IC1>,
12701237dccaSHoward Hinnant                                                      __bit_iterator<_Dp, _IC2>);
1271c003db1fSHoward Hinnant    template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>,
1272c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, _IC1>,
1273c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, _IC2>);
1274423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>,
1275c003db1fSHoward Hinnant                                                                          typename _Dp::size_type);
1276423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>,
1277c003db1fSHoward Hinnant                                                                           typename _Dp::size_type);
1278423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1279423a8d77SHoward Hinnant                   __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
1280423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1281423a8d77SHoward Hinnant                   __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
12823e519524SHoward Hinnant};
12833e519524SHoward Hinnant
12843e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
12853e519524SHoward Hinnant
12863e519524SHoward Hinnant#endif  // _LIBCPP___BIT_REFERENCE
1287