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
13*c74059c5SNikolas Klauser#include <__algorithm/copy_n.h>
14*c74059c5SNikolas Klauser#include <__algorithm/fill_n.h>
152e2f3158SNikolas Klauser#include <__algorithm/min.h>
16b973e2e2SThorsten Schütt#include <__bits>
174d81a46fSArthur O'Dwyer#include <__config>
182e2f3158SNikolas Klauser#include <__iterator/iterator_traits.h>
19*c74059c5SNikolas Klauser#include <__memory/construct_at.h>
202e2f3158SNikolas Klauser#include <__memory/pointer_traits.h>
212e2f3158SNikolas Klauser#include <cstring>
222e2f3158SNikolas Klauser#include <type_traits>
233e519524SHoward Hinnant
24073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
253e519524SHoward Hinnant#  pragma GCC system_header
26073458b1SHoward Hinnant#endif
273e519524SHoward Hinnant
28a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
29a016efb1SEric Fiselier#include <__undef_macros>
30a016efb1SEric Fiselier
31a016efb1SEric Fiselier
323e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
333e519524SHoward Hinnant
340ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
35c003db1fSHoward Hinnanttemplate <class _Cp> class __bit_const_reference;
363e519524SHoward Hinnant
37a7744562SHoward Hinnanttemplate <class _Tp>
38a7744562SHoward Hinnantstruct __has_storage_type
39a7744562SHoward Hinnant{
40a7744562SHoward Hinnant    static const bool value = false;
41a7744562SHoward Hinnant};
42a7744562SHoward Hinnant
43c003db1fSHoward Hinnanttemplate <class _Cp, bool = __has_storage_type<_Cp>::value>
443e519524SHoward Hinnantclass __bit_reference
453e519524SHoward Hinnant{
46c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type    __storage_type;
47c003db1fSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
483e519524SHoward Hinnant
493e519524SHoward Hinnant    __storage_pointer __seg_;
503e519524SHoward Hinnant    __storage_type    __mask_;
513e519524SHoward Hinnant
52c003db1fSHoward Hinnant    friend typename _Cp::__self;
53541f9e28SEric Fiselier
54c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
55c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, false>;
563e519524SHoward Hinnantpublic:
57*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
58b7eb30d4SFangrui Song    __bit_reference(const __bit_reference&) = default;
59b7eb30d4SFangrui Song
60*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 operator bool() const _NOEXCEPT
61d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
62*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool operator ~() const _NOEXCEPT
63d368a84cSHoward Hinnant        {return !static_cast<bool>(*this);}
643e519524SHoward Hinnant
65*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
66d368a84cSHoward Hinnant    __bit_reference& operator=(bool __x) _NOEXCEPT
673e519524SHoward Hinnant    {
683e519524SHoward Hinnant        if (__x)
693e519524SHoward Hinnant            *__seg_ |= __mask_;
703e519524SHoward Hinnant        else
713e519524SHoward Hinnant            *__seg_ &= ~__mask_;
723e519524SHoward Hinnant        return *this;
733e519524SHoward Hinnant    }
743e519524SHoward Hinnant
75fb9646edSNikolas Klauser#if _LIBCPP_STD_VER > 20
76*c74059c5SNikolas Klauser    _LIBCPP_HIDE_FROM_ABI constexpr const __bit_reference& operator=(bool __x) const noexcept {
77fb9646edSNikolas Klauser        if (__x)
78fb9646edSNikolas Klauser            *__seg_ |= __mask_;
79fb9646edSNikolas Klauser        else
80fb9646edSNikolas Klauser            *__seg_ &= ~__mask_;
81fb9646edSNikolas Klauser        return *this;
82fb9646edSNikolas Klauser    }
83fb9646edSNikolas Klauser#endif
84fb9646edSNikolas Klauser
85*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
86d368a84cSHoward Hinnant    __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT
87d368a84cSHoward Hinnant        {return operator=(static_cast<bool>(__x));}
883e519524SHoward Hinnant
89*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 void flip() _NOEXCEPT {*__seg_ ^= __mask_;}
90*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, false> operator&() const _NOEXCEPT
91f3b851f0SMarshall Clow        {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
923e519524SHoward Hinnantprivate:
93*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
94f86c2b6fSArthur O'Dwyer    explicit __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
95d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
963e519524SHoward Hinnant};
973e519524SHoward Hinnant
98c003db1fSHoward Hinnanttemplate <class _Cp>
99c003db1fSHoward Hinnantclass __bit_reference<_Cp, false>
100a7744562SHoward Hinnant{
101a7744562SHoward Hinnant};
102a7744562SHoward Hinnant
103d9db9f90SHoward Hinnanttemplate <class _Cp>
104*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
105d9db9f90SHoward Hinnantvoid
106d9db9f90SHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
107d9db9f90SHoward Hinnant{
108d9db9f90SHoward Hinnant    bool __t = __x;
109d9db9f90SHoward Hinnant    __x = __y;
110d9db9f90SHoward Hinnant    __y = __t;
111d9db9f90SHoward Hinnant}
112d9db9f90SHoward Hinnant
113c003db1fSHoward Hinnanttemplate <class _Cp, class _Dp>
114*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1153e519524SHoward Hinnantvoid
116c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
1173e519524SHoward Hinnant{
1183e519524SHoward Hinnant    bool __t = __x;
1193e519524SHoward Hinnant    __x = __y;
1203e519524SHoward Hinnant    __y = __t;
1213e519524SHoward Hinnant}
1223e519524SHoward Hinnant
123c003db1fSHoward Hinnanttemplate <class _Cp>
124*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1253e519524SHoward Hinnantvoid
126c003db1fSHoward Hinnantswap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
1273e519524SHoward Hinnant{
1283e519524SHoward Hinnant    bool __t = __x;
1293e519524SHoward Hinnant    __x = __y;
1303e519524SHoward Hinnant    __y = __t;
1313e519524SHoward Hinnant}
1323e519524SHoward Hinnant
133c003db1fSHoward Hinnanttemplate <class _Cp>
134*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1353e519524SHoward Hinnantvoid
136c003db1fSHoward Hinnantswap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
1373e519524SHoward Hinnant{
1383e519524SHoward Hinnant    bool __t = __x;
1393e519524SHoward Hinnant    __x = __y;
1403e519524SHoward Hinnant    __y = __t;
1413e519524SHoward Hinnant}
1423e519524SHoward Hinnant
143c003db1fSHoward Hinnanttemplate <class _Cp>
1443e519524SHoward Hinnantclass __bit_const_reference
1453e519524SHoward Hinnant{
146c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type          __storage_type;
147c003db1fSHoward Hinnant    typedef typename _Cp::__const_storage_pointer __storage_pointer;
1483e519524SHoward Hinnant
1493e519524SHoward Hinnant    __storage_pointer        __seg_;
1503e519524SHoward Hinnant    __storage_type __mask_;
1513e519524SHoward Hinnant
152c003db1fSHoward Hinnant    friend typename _Cp::__self;
153c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1543e519524SHoward Hinnantpublic:
1553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
156b7eb30d4SFangrui Song    __bit_const_reference(const __bit_const_reference&) = default;
157b7eb30d4SFangrui Song
158*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
159c003db1fSHoward Hinnant    __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
1603e519524SHoward Hinnant        : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
1613e519524SHoward Hinnant
162eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT
163d368a84cSHoward Hinnant        {return static_cast<bool>(*__seg_ & __mask_);}
1643e519524SHoward Hinnant
165*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, true> operator&() const _NOEXCEPT
166f3b851f0SMarshall Clow        {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
1673e519524SHoward Hinnantprivate:
1683e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
169eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR
170f86c2b6fSArthur O'Dwyer    explicit __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
171d368a84cSHoward Hinnant        : __seg_(__s), __mask_(__m) {}
1723e519524SHoward Hinnant
173b7eb30d4SFangrui Song    __bit_const_reference& operator=(const __bit_const_reference&) = delete;
1743e519524SHoward Hinnant};
1753e519524SHoward Hinnant
1763e519524SHoward Hinnant// find
1773e519524SHoward Hinnant
178423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
179*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, _IsConst>
180423a8d77SHoward Hinnant__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
1813e519524SHoward Hinnant{
182423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
1833e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
184*c74059c5SNikolas Klauser    const int __bits_per_word = _It::__bits_per_word;
1853e519524SHoward Hinnant    // do first partial word
1863e519524SHoward Hinnant    if (__first.__ctz_ != 0)
1873e519524SHoward Hinnant    {
1883e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
189ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
1903e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
1913e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1923e519524SHoward Hinnant        if (__b)
193f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
194303e27d8SHoward Hinnant        if (__n == __dn)
1950fc6e981SMarshall Clow            return __first + __n;
1963e519524SHoward Hinnant        __n -= __dn;
1973e519524SHoward Hinnant        ++__first.__seg_;
1983e519524SHoward Hinnant    }
1993e519524SHoward Hinnant    // do middle whole words
2003e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2013e519524SHoward Hinnant        if (*__first.__seg_)
202f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(*__first.__seg_)));
2033e519524SHoward Hinnant    // do last partial word
2043e519524SHoward Hinnant    if (__n > 0)
2053e519524SHoward Hinnant    {
2063e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
2073e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
2083e519524SHoward Hinnant        if (__b)
209f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
2103e519524SHoward Hinnant    }
2113e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
2123e519524SHoward Hinnant}
2133e519524SHoward Hinnant
214423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
215*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, _IsConst>
216423a8d77SHoward Hinnant__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2173e519524SHoward Hinnant{
218423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2193e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
220aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2213e519524SHoward Hinnant    // do first partial word
2223e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2233e519524SHoward Hinnant    {
2243e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
225ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2263e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
227423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2283e519524SHoward Hinnant        if (__b)
229f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
230303e27d8SHoward Hinnant        if (__n == __dn)
2310fc6e981SMarshall Clow            return __first + __n;
2323e519524SHoward Hinnant        __n -= __dn;
2333e519524SHoward Hinnant        ++__first.__seg_;
2343e519524SHoward Hinnant    }
2353e519524SHoward Hinnant    // do middle whole words
2363e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2373e519524SHoward Hinnant    {
2383e519524SHoward Hinnant        __storage_type __b = ~*__first.__seg_;
2393e519524SHoward Hinnant        if (__b)
240f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
2413e519524SHoward Hinnant    }
2423e519524SHoward Hinnant    // do last partial word
2433e519524SHoward Hinnant    if (__n > 0)
2443e519524SHoward Hinnant    {
2453e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
246423a8d77SHoward Hinnant        __storage_type __b = ~*__first.__seg_ & __m;
2473e519524SHoward Hinnant        if (__b)
248f3b851f0SMarshall Clow            return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
2493e519524SHoward Hinnant    }
2503e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
2513e519524SHoward Hinnant}
2523e519524SHoward Hinnant
253423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
254*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
255423a8d77SHoward Hinnant__bit_iterator<_Cp, _IsConst>
256b48c5010SNikolas Klauserfind(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value)
2573e519524SHoward Hinnant{
258b48c5010SNikolas Klauser    if (static_cast<bool>(__value))
259781c476cSArthur O'Dwyer        return _VSTD::__find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
260781c476cSArthur O'Dwyer    return _VSTD::__find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
2613e519524SHoward Hinnant}
2623e519524SHoward Hinnant
2633e519524SHoward Hinnant// count
2643e519524SHoward Hinnant
265423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
266423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
267423a8d77SHoward Hinnant__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2683e519524SHoward Hinnant{
269423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
2703e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2713e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
272aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
2733e519524SHoward Hinnant    difference_type __r = 0;
2743e519524SHoward Hinnant    // do first partial word
2753e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2763e519524SHoward Hinnant    {
2773e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
278ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
2793e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
280f3b851f0SMarshall Clow        __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
2813e519524SHoward Hinnant        __n -= __dn;
2823e519524SHoward Hinnant        ++__first.__seg_;
2833e519524SHoward Hinnant    }
2843e519524SHoward Hinnant    // do middle whole words
2853e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
286f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(*__first.__seg_);
2873e519524SHoward Hinnant    // do last partial word
2883e519524SHoward Hinnant    if (__n > 0)
2893e519524SHoward Hinnant    {
2903e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
291f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
2923e519524SHoward Hinnant    }
2933e519524SHoward Hinnant    return __r;
2943e519524SHoward Hinnant}
2953e519524SHoward Hinnant
296423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst>
297423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
298423a8d77SHoward Hinnant__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
2993e519524SHoward Hinnant{
300423a8d77SHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _It;
3013e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
3023e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
303aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3043e519524SHoward Hinnant    difference_type __r = 0;
3053e519524SHoward Hinnant    // do first partial word
3063e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3073e519524SHoward Hinnant    {
3083e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
309ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3103e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
311f3b851f0SMarshall Clow        __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
3123e519524SHoward Hinnant        __n -= __dn;
3133e519524SHoward Hinnant        ++__first.__seg_;
3143e519524SHoward Hinnant    }
3153e519524SHoward Hinnant    // do middle whole words
3163e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
317f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(~*__first.__seg_);
3183e519524SHoward Hinnant    // do last partial word
3193e519524SHoward Hinnant    if (__n > 0)
3203e519524SHoward Hinnant    {
3213e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
322f3b851f0SMarshall Clow        __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
3233e519524SHoward Hinnant    }
3243e519524SHoward Hinnant    return __r;
3253e519524SHoward Hinnant}
3263e519524SHoward Hinnant
327423a8d77SHoward Hinnanttemplate <class _Cp, bool _IsConst, class _Tp>
3283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
329423a8d77SHoward Hinnanttypename __bit_iterator<_Cp, _IsConst>::difference_type
330b48c5010SNikolas Klausercount(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value)
3313e519524SHoward Hinnant{
332b48c5010SNikolas Klauser    if (static_cast<bool>(__value))
333781c476cSArthur O'Dwyer        return _VSTD::__count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
334781c476cSArthur O'Dwyer    return _VSTD::__count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
3353e519524SHoward Hinnant}
3363e519524SHoward Hinnant
3373e519524SHoward Hinnant// fill_n
3383e519524SHoward Hinnant
339c003db1fSHoward Hinnanttemplate <class _Cp>
340*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 void
341c003db1fSHoward Hinnant__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3423e519524SHoward Hinnant{
343c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3443e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
345aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3463e519524SHoward Hinnant    // do first partial word
3473e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3483e519524SHoward Hinnant    {
3493e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
350ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3513e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3523e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3533e519524SHoward Hinnant        __n -= __dn;
3543e519524SHoward Hinnant        ++__first.__seg_;
3553e519524SHoward Hinnant    }
3563e519524SHoward Hinnant    // do middle whole words
3573e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
358*c74059c5SNikolas Klauser    std::fill_n(std::__to_address(__first.__seg_), __nw, 0);
3593e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3603e519524SHoward Hinnant    // do last partial word
3613e519524SHoward Hinnant    if (__n > 0)
3623e519524SHoward Hinnant    {
3633e519524SHoward Hinnant        __first.__seg_ += __nw;
3643e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3653e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3663e519524SHoward Hinnant    }
3673e519524SHoward Hinnant}
3683e519524SHoward Hinnant
369c003db1fSHoward Hinnanttemplate <class _Cp>
370*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 void
371c003db1fSHoward Hinnant__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
3723e519524SHoward Hinnant{
373c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _It;
3743e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
375aec08784SEric Fiselier    const int __bits_per_word = _It::__bits_per_word;
3763e519524SHoward Hinnant    // do first partial word
3773e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3783e519524SHoward Hinnant    {
3793e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
380ce48a113SHoward Hinnant        __storage_type __dn = _VSTD::min(__clz_f, __n);
3813e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3823e519524SHoward Hinnant        *__first.__seg_ |= __m;
3833e519524SHoward Hinnant        __n -= __dn;
3843e519524SHoward Hinnant        ++__first.__seg_;
3853e519524SHoward Hinnant    }
3863e519524SHoward Hinnant    // do middle whole words
3873e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
388*c74059c5SNikolas Klauser    // __storage_type is always an unsigned type, so -1 sets all bits
389*c74059c5SNikolas Klauser    std::fill_n(std::__to_address(__first.__seg_), __nw, static_cast<__storage_type>(-1));
3903e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3913e519524SHoward Hinnant    // do last partial word
3923e519524SHoward Hinnant    if (__n > 0)
3933e519524SHoward Hinnant    {
3943e519524SHoward Hinnant        __first.__seg_ += __nw;
3953e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3963e519524SHoward Hinnant        *__first.__seg_ |= __m;
3973e519524SHoward Hinnant    }
3983e519524SHoward Hinnant}
3993e519524SHoward Hinnant
400c003db1fSHoward Hinnanttemplate <class _Cp>
401*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
4023e519524SHoward Hinnantvoid
403b48c5010SNikolas Klauserfill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value)
4043e519524SHoward Hinnant{
4053e519524SHoward Hinnant    if (__n > 0)
4063e519524SHoward Hinnant    {
407b48c5010SNikolas Klauser        if (__value)
408781c476cSArthur O'Dwyer            _VSTD::__fill_n_true(__first, __n);
4093e519524SHoward Hinnant        else
410781c476cSArthur O'Dwyer            _VSTD::__fill_n_false(__first, __n);
4113e519524SHoward Hinnant    }
4123e519524SHoward Hinnant}
4133e519524SHoward Hinnant
4143e519524SHoward Hinnant// fill
4153e519524SHoward Hinnant
416c003db1fSHoward Hinnanttemplate <class _Cp>
417*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
4183e519524SHoward Hinnantvoid
419b48c5010SNikolas Klauserfill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value)
4203e519524SHoward Hinnant{
421b48c5010SNikolas Klauser    _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value);
4223e519524SHoward Hinnant}
4233e519524SHoward Hinnant
4243e519524SHoward Hinnant// copy
4253e519524SHoward Hinnant
426c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
427*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17
428c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
429c003db1fSHoward Hinnant__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
430c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
4313e519524SHoward Hinnant{
432c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4333e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4343e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
435aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
4363e519524SHoward Hinnant    difference_type __n = __last - __first;
4373e519524SHoward Hinnant    if (__n > 0)
4383e519524SHoward Hinnant    {
4393e519524SHoward Hinnant        // do first word
4403e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4413e519524SHoward Hinnant        {
4423e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
443ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
4443e519524SHoward Hinnant            __n -= __dn;
4453e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
4463e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4473e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4483e519524SHoward Hinnant            *__result.__seg_ |= __b;
4493e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
4503e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
4513e519524SHoward Hinnant            ++__first.__seg_;
4523e519524SHoward Hinnant            // __first.__ctz_ = 0;
4533e519524SHoward Hinnant        }
4543e519524SHoward Hinnant        // __first.__ctz_ == 0;
4553e519524SHoward Hinnant        // do middle words
4563e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
457*c74059c5SNikolas Klauser        std::copy_n(std::__to_address(__first.__seg_), __nw, std::__to_address(__result.__seg_));
4583e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
4593e519524SHoward Hinnant        __result.__seg_ += __nw;
4603e519524SHoward Hinnant        // do last word
4613e519524SHoward Hinnant        if (__n > 0)
4623e519524SHoward Hinnant        {
4633e519524SHoward Hinnant            __first.__seg_ += __nw;
4643e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4653e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4663e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4673e519524SHoward Hinnant            *__result.__seg_ |= __b;
4683e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
4693e519524SHoward Hinnant        }
4703e519524SHoward Hinnant    }
4713e519524SHoward Hinnant    return __result;
4723e519524SHoward Hinnant}
4733e519524SHoward Hinnant
474c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
475*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17
476c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
477c003db1fSHoward Hinnant__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
478c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
4793e519524SHoward Hinnant{
480c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
4813e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4823e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
483*c74059c5SNikolas Klauser    const int __bits_per_word = _In::__bits_per_word;
4843e519524SHoward Hinnant    difference_type __n = __last - __first;
4853e519524SHoward Hinnant    if (__n > 0)
4863e519524SHoward Hinnant    {
4873e519524SHoward Hinnant        // do first word
4883e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4893e519524SHoward Hinnant        {
4903e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
491ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
4923e519524SHoward Hinnant            __n -= __dn;
4933e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
4943e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4953e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
496ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
4973e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
4983e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4993e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
5003e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
5013e519524SHoward Hinnant            else
5023e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
5033e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
5043e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
5053e519524SHoward Hinnant            __dn -= __ddn;
5063e519524SHoward Hinnant            if (__dn > 0)
5073e519524SHoward Hinnant            {
5083e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
5093e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5103e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
5113e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
5123e519524SHoward Hinnant            }
5133e519524SHoward Hinnant            ++__first.__seg_;
5143e519524SHoward Hinnant            // __first.__ctz_ = 0;
5153e519524SHoward Hinnant        }
5163e519524SHoward Hinnant        // __first.__ctz_ == 0;
5173e519524SHoward Hinnant        // do middle words
5183e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
5193e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
5203e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
5213e519524SHoward Hinnant        {
5223e519524SHoward Hinnant            __storage_type __b = *__first.__seg_;
5233e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5243e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5253e519524SHoward Hinnant            ++__result.__seg_;
5263e519524SHoward Hinnant            *__result.__seg_ &= __m;
5273e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
5283e519524SHoward Hinnant        }
5293e519524SHoward Hinnant        // do last word
5303e519524SHoward Hinnant        if (__n > 0)
5313e519524SHoward Hinnant        {
5323e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
5333e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
534ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
5353e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
5363e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5373e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
5383e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
5393e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
5403e519524SHoward Hinnant            __n -= __dn;
5413e519524SHoward Hinnant            if (__n > 0)
5423e519524SHoward Hinnant            {
5433e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
5443e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5453e519524SHoward Hinnant                *__result.__seg_ |= __b >> __dn;
5463e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
5473e519524SHoward Hinnant            }
5483e519524SHoward Hinnant        }
5493e519524SHoward Hinnant    }
5503e519524SHoward Hinnant    return __result;
5513e519524SHoward Hinnant}
5523e519524SHoward Hinnant
553c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
554*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
555c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
556c003db1fSHoward Hinnantcopy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
5573e519524SHoward Hinnant{
5583e519524SHoward Hinnant    if (__first.__ctz_ == __result.__ctz_)
559781c476cSArthur O'Dwyer        return _VSTD::__copy_aligned(__first, __last, __result);
560781c476cSArthur O'Dwyer    return _VSTD::__copy_unaligned(__first, __last, __result);
5613e519524SHoward Hinnant}
5623e519524SHoward Hinnant
5633e519524SHoward Hinnant// copy_backward
5643e519524SHoward Hinnant
565c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
566*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, false>
567c003db1fSHoward Hinnant__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
568c003db1fSHoward Hinnant                                                     __bit_iterator<_Cp, false> __result)
5693e519524SHoward Hinnant{
570c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
5713e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
5723e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
573aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
5743e519524SHoward Hinnant    difference_type __n = __last - __first;
5753e519524SHoward Hinnant    if (__n > 0)
5763e519524SHoward Hinnant    {
5773e519524SHoward Hinnant        // do first word
5783e519524SHoward Hinnant        if (__last.__ctz_ != 0)
5793e519524SHoward Hinnant        {
580ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
5813e519524SHoward Hinnant            __n -= __dn;
5823e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __last.__ctz_;
5833e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
5843e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
5853e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5863e519524SHoward Hinnant            *__result.__seg_ |= __b;
5873e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
5883e519524SHoward Hinnant                                                       __result.__ctz_)  % __bits_per_word);
5893e519524SHoward Hinnant            // __last.__ctz_ = 0
5903e519524SHoward Hinnant         }
5913e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
5923e519524SHoward Hinnant        // __result.__ctz_ == 0 || __n == 0
5933e519524SHoward Hinnant        // do middle words
5943e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
5953e519524SHoward Hinnant        __result.__seg_ -= __nw;
5963e519524SHoward Hinnant        __last.__seg_ -= __nw;
597*c74059c5SNikolas Klauser        std::copy_n(std::__to_address(__last.__seg_), __nw, std::__to_address(__result.__seg_));
5983e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
5993e519524SHoward Hinnant        // do last word
6003e519524SHoward Hinnant        if (__n > 0)
6013e519524SHoward Hinnant        {
6023e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
6033e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
6043e519524SHoward Hinnant            *--__result.__seg_ &= ~__m;
6053e519524SHoward Hinnant            *__result.__seg_ |= __b;
6063e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
6073e519524SHoward Hinnant        }
6083e519524SHoward Hinnant    }
6093e519524SHoward Hinnant    return __result;
6103e519524SHoward Hinnant}
6113e519524SHoward Hinnant
612c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
613*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, false>
614c003db1fSHoward Hinnant__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
615c003db1fSHoward Hinnant                                                       __bit_iterator<_Cp, false> __result)
6163e519524SHoward Hinnant{
617c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, _IsConst> _In;
6183e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
6193e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
620aec08784SEric Fiselier    const int __bits_per_word = _In::__bits_per_word;
6213e519524SHoward Hinnant    difference_type __n = __last - __first;
6223e519524SHoward Hinnant    if (__n > 0)
6233e519524SHoward Hinnant    {
6243e519524SHoward Hinnant        // do first word
6253e519524SHoward Hinnant        if (__last.__ctz_ != 0)
6263e519524SHoward Hinnant        {
627ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
6283e519524SHoward Hinnant            __n -= __dn;
6293e519524SHoward Hinnant            unsigned __clz_l = __bits_per_word - __last.__ctz_;
6303e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
6313e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
6323e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
633ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_));
6343e519524SHoward Hinnant            if (__ddn > 0)
6353e519524SHoward Hinnant            {
6363e519524SHoward Hinnant                __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
6373e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6383e519524SHoward Hinnant                if (__result.__ctz_ > __last.__ctz_)
6393e519524SHoward Hinnant                    *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6403e519524SHoward Hinnant                else
6413e519524SHoward Hinnant                    *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
6423e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
6433e519524SHoward Hinnant                                                         __result.__ctz_)  % __bits_per_word);
6443e519524SHoward Hinnant                __dn -= __ddn;
6453e519524SHoward Hinnant            }
6463e519524SHoward Hinnant            if (__dn > 0)
6473e519524SHoward Hinnant            {
6483e519524SHoward Hinnant                // __result.__ctz_ == 0
6493e519524SHoward Hinnant                --__result.__seg_;
6503e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
6513e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6523e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6533e519524SHoward Hinnant                __last.__ctz_ -= __dn + __ddn;
6543e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
6553e519524SHoward Hinnant            }
6563e519524SHoward Hinnant            // __last.__ctz_ = 0
6573e519524SHoward Hinnant         }
6583e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
6593e519524SHoward Hinnant        // __result.__ctz_ != 0 || __n == 0
6603e519524SHoward Hinnant        // do middle words
6613e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
6623e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> __clz_r;
6633e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word)
6643e519524SHoward Hinnant        {
6653e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_;
6663e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6673e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
6683e519524SHoward Hinnant            *--__result.__seg_ &= __m;
6693e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
6703e519524SHoward Hinnant        }
6713e519524SHoward Hinnant        // do last word
6723e519524SHoward Hinnant        if (__n > 0)
6733e519524SHoward Hinnant        {
6743e519524SHoward Hinnant            __m = ~__storage_type(0) << (__bits_per_word - __n);
6753e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
676c206366fSHoward Hinnant            __clz_r = __bits_per_word - __result.__ctz_;
677ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_));
6783e519524SHoward Hinnant            __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
6793e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6803e519524SHoward Hinnant            *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
6813e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
6823e519524SHoward Hinnant                                                     __result.__ctz_)  % __bits_per_word);
6833e519524SHoward Hinnant            __n -= __dn;
6843e519524SHoward Hinnant            if (__n > 0)
6853e519524SHoward Hinnant            {
6863e519524SHoward Hinnant                // __result.__ctz_ == 0
6873e519524SHoward Hinnant                --__result.__seg_;
6883e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
6893e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6903e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6913e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
6923e519524SHoward Hinnant            }
6933e519524SHoward Hinnant        }
6943e519524SHoward Hinnant    }
6953e519524SHoward Hinnant    return __result;
6963e519524SHoward Hinnant}
6973e519524SHoward Hinnant
698c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
699*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
700c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
701c003db1fSHoward Hinnantcopy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
7023e519524SHoward Hinnant{
7033e519524SHoward Hinnant    if (__last.__ctz_ == __result.__ctz_)
704781c476cSArthur O'Dwyer        return _VSTD::__copy_backward_aligned(__first, __last, __result);
705781c476cSArthur O'Dwyer    return _VSTD::__copy_backward_unaligned(__first, __last, __result);
7063e519524SHoward Hinnant}
7073e519524SHoward Hinnant
7083e519524SHoward Hinnant// move
7093e519524SHoward Hinnant
710c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
7113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
712c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
713c003db1fSHoward Hinnantmove(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
7143e519524SHoward Hinnant{
715ce48a113SHoward Hinnant    return _VSTD::copy(__first, __last, __result);
7163e519524SHoward Hinnant}
7173e519524SHoward Hinnant
7183e519524SHoward Hinnant// move_backward
7193e519524SHoward Hinnant
720c003db1fSHoward Hinnanttemplate <class _Cp, bool _IsConst>
7213e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
722c003db1fSHoward Hinnant__bit_iterator<_Cp, false>
723c003db1fSHoward Hinnantmove_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
7243e519524SHoward Hinnant{
72508de4b0dSMarshall Clow    return _VSTD::copy_backward(__first, __last, __result);
7263e519524SHoward Hinnant}
7273e519524SHoward Hinnant
7283e519524SHoward Hinnant// swap_ranges
7293e519524SHoward Hinnant
730dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
731dbe81119SHoward Hinnant__bit_iterator<__C2, false>
732dbe81119SHoward Hinnant__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
733dbe81119SHoward Hinnant                      __bit_iterator<__C2, false> __result)
7343e519524SHoward Hinnant{
735dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7363e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7373e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
738aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7393e519524SHoward Hinnant    difference_type __n = __last - __first;
7403e519524SHoward Hinnant    if (__n > 0)
7413e519524SHoward Hinnant    {
7423e519524SHoward Hinnant        // do first word
7433e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7443e519524SHoward Hinnant        {
7453e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
746ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
7473e519524SHoward Hinnant            __n -= __dn;
7483e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
7493e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7503e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7513e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7523e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7533e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7543e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7553e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
7563e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
7573e519524SHoward Hinnant            ++__first.__seg_;
7583e519524SHoward Hinnant            // __first.__ctz_ = 0;
7593e519524SHoward Hinnant        }
7603e519524SHoward Hinnant        // __first.__ctz_ == 0;
7613e519524SHoward Hinnant        // do middle words
7623e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
7633e519524SHoward Hinnant            swap(*__first.__seg_, *__result.__seg_);
7643e519524SHoward Hinnant        // do last word
7653e519524SHoward Hinnant        if (__n > 0)
7663e519524SHoward Hinnant        {
7673e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
7683e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7693e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7703e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7713e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7723e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7733e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7743e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
7753e519524SHoward Hinnant        }
7763e519524SHoward Hinnant    }
7773e519524SHoward Hinnant    return __result;
7783e519524SHoward Hinnant}
7793e519524SHoward Hinnant
780dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
781dbe81119SHoward Hinnant__bit_iterator<__C2, false>
782dbe81119SHoward Hinnant__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
783dbe81119SHoward Hinnant                        __bit_iterator<__C2, false> __result)
7843e519524SHoward Hinnant{
785dbe81119SHoward Hinnant    typedef __bit_iterator<__C1, false> _I1;
7863e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7873e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
788aec08784SEric Fiselier    const int __bits_per_word = _I1::__bits_per_word;
7893e519524SHoward Hinnant    difference_type __n = __last - __first;
7903e519524SHoward Hinnant    if (__n > 0)
7913e519524SHoward Hinnant    {
7923e519524SHoward Hinnant        // do first word
7933e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7943e519524SHoward Hinnant        {
7953e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
796ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
7973e519524SHoward Hinnant            __n -= __dn;
7983e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
7993e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
8003e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
8013e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
802ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
8033e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
8043e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8053e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8063e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
8073e519524SHoward Hinnant            {
8083e519524SHoward Hinnant                unsigned __s = __result.__ctz_ - __first.__ctz_;
8093e519524SHoward Hinnant                *__result.__seg_ |= __b1 << __s;
8103e519524SHoward Hinnant                *__first.__seg_  |= __b2 >> __s;
8113e519524SHoward Hinnant            }
8123e519524SHoward Hinnant            else
8133e519524SHoward Hinnant            {
8143e519524SHoward Hinnant                unsigned __s = __first.__ctz_ - __result.__ctz_;
8153e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
8163e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8173e519524SHoward Hinnant            }
8183e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
8193e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
8203e519524SHoward Hinnant            __dn -= __ddn;
8213e519524SHoward Hinnant            if (__dn > 0)
8223e519524SHoward Hinnant            {
8233e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
8243e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8253e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8263e519524SHoward Hinnant                unsigned __s = __first.__ctz_ + __ddn;
8273e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
8283e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
8293e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
8303e519524SHoward Hinnant            }
8313e519524SHoward Hinnant            ++__first.__seg_;
8323e519524SHoward Hinnant            // __first.__ctz_ = 0;
8333e519524SHoward Hinnant        }
8343e519524SHoward Hinnant        // __first.__ctz_ == 0;
8353e519524SHoward Hinnant        // do middle words
8363e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
8373e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
8383e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
8393e519524SHoward Hinnant        {
8403e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_;
8413e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8423e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8433e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8443e519524SHoward Hinnant            *__first.__seg_  = __b2 >> __result.__ctz_;
8453e519524SHoward Hinnant            ++__result.__seg_;
8463e519524SHoward Hinnant            __b2 = *__result.__seg_ & ~__m;
8473e519524SHoward Hinnant            *__result.__seg_ &= __m;
8483e519524SHoward Hinnant            *__result.__seg_ |= __b1 >> __clz_r;
8493e519524SHoward Hinnant            *__first.__seg_  |= __b2 << __clz_r;
8503e519524SHoward Hinnant        }
8513e519524SHoward Hinnant        // do last word
8523e519524SHoward Hinnant        if (__n > 0)
8533e519524SHoward Hinnant        {
8543e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
8553e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
8563e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
857ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r);
8583e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
8593e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8603e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8613e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8623e519524SHoward Hinnant            *__first.__seg_  |= __b2 >> __result.__ctz_;
8633e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
8643e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
8653e519524SHoward Hinnant            __n -= __dn;
8663e519524SHoward Hinnant            if (__n > 0)
8673e519524SHoward Hinnant            {
8683e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
8693e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8703e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8713e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __dn;
8723e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __dn;
8733e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
8743e519524SHoward Hinnant            }
8753e519524SHoward Hinnant        }
8763e519524SHoward Hinnant    }
8773e519524SHoward Hinnant    return __result;
8783e519524SHoward Hinnant}
8793e519524SHoward Hinnant
880dbe81119SHoward Hinnanttemplate <class __C1, class __C2>
8813e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
882dbe81119SHoward Hinnant__bit_iterator<__C2, false>
883dbe81119SHoward Hinnantswap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1,
884dbe81119SHoward Hinnant            __bit_iterator<__C2, false> __first2)
8853e519524SHoward Hinnant{
8863e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
887781c476cSArthur O'Dwyer        return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2);
888781c476cSArthur O'Dwyer    return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2);
8893e519524SHoward Hinnant}
8903e519524SHoward Hinnant
8913e519524SHoward Hinnant// rotate
8923e519524SHoward Hinnant
893c003db1fSHoward Hinnanttemplate <class _Cp>
8943e519524SHoward Hinnantstruct __bit_array
8953e519524SHoward Hinnant{
896c003db1fSHoward Hinnant    typedef typename _Cp::difference_type difference_type;
897c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type  __storage_type;
8983ec1f00bSHoward Hinnant    typedef typename _Cp::__storage_pointer __storage_pointer;
899c003db1fSHoward Hinnant    typedef typename _Cp::iterator        iterator;
900c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
901c003db1fSHoward Hinnant    static const unsigned _Np = 4;
9023e519524SHoward Hinnant
9033e519524SHoward Hinnant    difference_type __size_;
904c003db1fSHoward Hinnant    __storage_type __word_[_Np];
9053e519524SHoward Hinnant
906*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 static difference_type capacity()
907c003db1fSHoward Hinnant        {return static_cast<difference_type>(_Np * __bits_per_word);}
908*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit __bit_array(difference_type __s) : __size_(__s) {
909*c74059c5SNikolas Klauser        if (__libcpp_is_constant_evaluated()) {
910*c74059c5SNikolas Klauser            for (size_t __i = 0; __i != __bit_array<_Cp>::_Np; ++__i)
911*c74059c5SNikolas Klauser                std::__construct_at(__word_ + __i, 0);
912*c74059c5SNikolas Klauser        }
913*c74059c5SNikolas Klauser    }
914*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 iterator begin()
9153ec1f00bSHoward Hinnant    {
9163ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
9173ec1f00bSHoward Hinnant    }
918*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 iterator end()
9193ec1f00bSHoward Hinnant    {
9203ec1f00bSHoward Hinnant        return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
9213ec1f00bSHoward Hinnant                                                  static_cast<unsigned>(__size_ % __bits_per_word));
9223ec1f00bSHoward Hinnant    }
9233e519524SHoward Hinnant};
9243e519524SHoward Hinnant
925c003db1fSHoward Hinnanttemplate <class _Cp>
926*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator<_Cp, false>
927c003db1fSHoward Hinnantrotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last)
9283e519524SHoward Hinnant{
929c003db1fSHoward Hinnant    typedef __bit_iterator<_Cp, false> _I1;
9303e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
9313e519524SHoward Hinnant    difference_type __d1 = __middle - __first;
9323e519524SHoward Hinnant    difference_type __d2 = __last - __middle;
9333e519524SHoward Hinnant    _I1 __r = __first + __d2;
9343e519524SHoward Hinnant    while (__d1 != 0 && __d2 != 0)
9353e519524SHoward Hinnant    {
9363e519524SHoward Hinnant        if (__d1 <= __d2)
9373e519524SHoward Hinnant        {
938c003db1fSHoward Hinnant            if (__d1 <= __bit_array<_Cp>::capacity())
9393e519524SHoward Hinnant            {
940c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d1);
941ce48a113SHoward Hinnant                _VSTD::copy(__first, __middle, __b.begin());
942ce48a113SHoward Hinnant                _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
9433e519524SHoward Hinnant                break;
9443e519524SHoward Hinnant            }
9453e519524SHoward Hinnant            else
9463e519524SHoward Hinnant            {
947c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
9483e519524SHoward Hinnant                __first = __middle;
9493e519524SHoward Hinnant                __middle = __mp;
9503e519524SHoward Hinnant                __d2 -= __d1;
9513e519524SHoward Hinnant            }
9523e519524SHoward Hinnant        }
9533e519524SHoward Hinnant        else
9543e519524SHoward Hinnant        {
955c003db1fSHoward Hinnant            if (__d2 <= __bit_array<_Cp>::capacity())
9563e519524SHoward Hinnant            {
957c003db1fSHoward Hinnant                __bit_array<_Cp> __b(__d2);
958ce48a113SHoward Hinnant                _VSTD::copy(__middle, __last, __b.begin());
959ce48a113SHoward Hinnant                _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last));
9603e519524SHoward Hinnant                break;
9613e519524SHoward Hinnant            }
9623e519524SHoward Hinnant            else
9633e519524SHoward Hinnant            {
964c003db1fSHoward Hinnant                __bit_iterator<_Cp, false> __mp = __first + __d2;
965ce48a113SHoward Hinnant                _VSTD::swap_ranges(__first, __mp, __middle);
9663e519524SHoward Hinnant                __first = __mp;
9673e519524SHoward Hinnant                __d1 -= __d2;
9683e519524SHoward Hinnant            }
9693e519524SHoward Hinnant        }
9703e519524SHoward Hinnant    }
9713e519524SHoward Hinnant    return __r;
9723e519524SHoward Hinnant}
9733e519524SHoward Hinnant
9743e519524SHoward Hinnant// equal
9753e519524SHoward Hinnant
9761237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
977*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
9781237dccaSHoward Hinnant__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
9791237dccaSHoward Hinnant                  __bit_iterator<_Cp, _IC2> __first2)
9803e519524SHoward Hinnant{
9811237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
9823e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
9833e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
984*c74059c5SNikolas Klauser    const int __bits_per_word = _It::__bits_per_word;
9853e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
9863e519524SHoward Hinnant    if (__n > 0)
9873e519524SHoward Hinnant    {
9883e519524SHoward Hinnant        // do first word
9893e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
9903e519524SHoward Hinnant        {
9913e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first1.__ctz_;
992ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
9933e519524SHoward Hinnant            __n -= __dn;
9943e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
9953e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
9963e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __first2.__ctz_;
997ce48a113SHoward Hinnant            __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
9983e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
9993e519524SHoward Hinnant            if (__first2.__ctz_ > __first1.__ctz_)
10004c0de496SHoward Hinnant            {
10013e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
10023e519524SHoward Hinnant                    return false;
10034c0de496SHoward Hinnant            }
10043e519524SHoward Hinnant            else
10054c0de496SHoward Hinnant            {
10063e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
10073e519524SHoward Hinnant                    return false;
10084c0de496SHoward Hinnant            }
10093e519524SHoward Hinnant            __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
10103e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_)  % __bits_per_word);
10113e519524SHoward Hinnant            __dn -= __ddn;
10123e519524SHoward Hinnant            if (__dn > 0)
10133e519524SHoward Hinnant            {
10143e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
10153e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
10163e519524SHoward Hinnant                    return false;
10173e519524SHoward Hinnant                __first2.__ctz_ = static_cast<unsigned>(__dn);
10183e519524SHoward Hinnant            }
10193e519524SHoward Hinnant            ++__first1.__seg_;
10203e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10213e519524SHoward Hinnant        }
10223e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10233e519524SHoward Hinnant        // do middle words
10243e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __first2.__ctz_;
10253e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
10263e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
10273e519524SHoward Hinnant        {
10283e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_;
10293e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10303e519524SHoward Hinnant                return false;
10313e519524SHoward Hinnant            ++__first2.__seg_;
10323e519524SHoward Hinnant            if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
10333e519524SHoward Hinnant                return false;
10343e519524SHoward Hinnant        }
10353e519524SHoward Hinnant        // do last word
10363e519524SHoward Hinnant        if (__n > 0)
10373e519524SHoward Hinnant        {
10383e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
10393e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
1040ce48a113SHoward Hinnant            __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
10413e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
10423e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
10433e519524SHoward Hinnant                return false;
10443e519524SHoward Hinnant            __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
10453e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_)  % __bits_per_word);
10463e519524SHoward Hinnant            __n -= __dn;
10473e519524SHoward Hinnant            if (__n > 0)
10483e519524SHoward Hinnant            {
10493e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
10503e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> __dn))
10513e519524SHoward Hinnant                    return false;
10523e519524SHoward Hinnant            }
10533e519524SHoward Hinnant        }
10543e519524SHoward Hinnant    }
10553e519524SHoward Hinnant    return true;
10563e519524SHoward Hinnant}
10573e519524SHoward Hinnant
10581237dccaSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
1059*c74059c5SNikolas Klauser_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
10601237dccaSHoward Hinnant__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
10611237dccaSHoward Hinnant                __bit_iterator<_Cp, _IC2> __first2)
10623e519524SHoward Hinnant{
10631237dccaSHoward Hinnant    typedef __bit_iterator<_Cp, _IC1> _It;
10643e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
10653e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
1066*c74059c5SNikolas Klauser    const int __bits_per_word = _It::__bits_per_word;
10673e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
10683e519524SHoward Hinnant    if (__n > 0)
10693e519524SHoward Hinnant    {
10703e519524SHoward Hinnant        // do first word
10713e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
10723e519524SHoward Hinnant        {
10733e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first1.__ctz_;
1074ce48a113SHoward Hinnant            difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
10753e519524SHoward Hinnant            __n -= __dn;
10763e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
10773e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10783e519524SHoward Hinnant                return false;
10793e519524SHoward Hinnant            ++__first2.__seg_;
10803e519524SHoward Hinnant            ++__first1.__seg_;
10813e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10823e519524SHoward Hinnant            // __first2.__ctz_ = 0;
10833e519524SHoward Hinnant        }
10843e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10853e519524SHoward Hinnant        // __first2.__ctz_ == 0;
10863e519524SHoward Hinnant        // do middle words
10873e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
10883e519524SHoward Hinnant            if (*__first2.__seg_ != *__first1.__seg_)
10893e519524SHoward Hinnant                return false;
10903e519524SHoward Hinnant        // do last word
10913e519524SHoward Hinnant        if (__n > 0)
10923e519524SHoward Hinnant        {
10933e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
10943e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10953e519524SHoward Hinnant                return false;
10963e519524SHoward Hinnant        }
10973e519524SHoward Hinnant    }
10983e519524SHoward Hinnant    return true;
10993e519524SHoward Hinnant}
11003e519524SHoward Hinnant
1101c003db1fSHoward Hinnanttemplate <class _Cp, bool _IC1, bool _IC2>
1102*c74059c5SNikolas Klauserinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
11033e519524SHoward Hinnantbool
1104c003db1fSHoward Hinnantequal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2)
11053e519524SHoward Hinnant{
11063e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
1107781c476cSArthur O'Dwyer        return _VSTD::__equal_aligned(__first1, __last1, __first2);
1108781c476cSArthur O'Dwyer    return _VSTD::__equal_unaligned(__first1, __last1, __first2);
11093e519524SHoward Hinnant}
11103e519524SHoward Hinnant
11110ae9efebSHoward Hinnanttemplate <class _Cp, bool _IsConst,
11120ae9efebSHoward Hinnant          typename _Cp::__storage_type>
11133e519524SHoward Hinnantclass __bit_iterator
11143e519524SHoward Hinnant{
11153e519524SHoward Hinnantpublic:
1116c003db1fSHoward Hinnant    typedef typename _Cp::difference_type                                                          difference_type;
11173e519524SHoward Hinnant    typedef bool                                                                                  value_type;
11183e519524SHoward Hinnant    typedef __bit_iterator                                                                        pointer;
1119907ed12dSNikolas Klauser#ifndef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL
1120c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
1121907ed12dSNikolas Klauser#else
1122907ed12dSNikolas Klauser    using reference = typename conditional<_IsConst, bool, __bit_reference<_Cp> >::type;
1123907ed12dSNikolas Klauser#endif
11243e519524SHoward Hinnant    typedef random_access_iterator_tag                                                            iterator_category;
11253e519524SHoward Hinnant
11263e519524SHoward Hinnantprivate:
1127c003db1fSHoward Hinnant    typedef typename _Cp::__storage_type                                           __storage_type;
1128c003db1fSHoward Hinnant    typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer,
1129c003db1fSHoward Hinnant                                           typename _Cp::__storage_pointer>::type  __storage_pointer;
1130c003db1fSHoward Hinnant    static const unsigned __bits_per_word = _Cp::__bits_per_word;
11313e519524SHoward Hinnant
11323e519524SHoward Hinnant    __storage_pointer __seg_;
11333e519524SHoward Hinnant    unsigned          __ctz_;
11343e519524SHoward Hinnant
11353e519524SHoward Hinnantpublic:
1136*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator() _NOEXCEPT
113736b2a3b0SMarshall Clow#if _LIBCPP_STD_VER > 11
113836b2a3b0SMarshall Clow    : __seg_(nullptr), __ctz_(0)
113936b2a3b0SMarshall Clow#endif
114036b2a3b0SMarshall Clow    {}
11413e519524SHoward Hinnant
114270d94c3fSArthur O'Dwyer    // When _IsConst=false, this is the copy constructor.
114370d94c3fSArthur O'Dwyer    // It is non-trivial. Making it trivial would break ABI.
114470d94c3fSArthur O'Dwyer    // When _IsConst=true, this is a converting constructor;
114570d94c3fSArthur O'Dwyer    // the copy and move constructors are implicitly generated
114670d94c3fSArthur O'Dwyer    // and trivial.
1147*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
114870d94c3fSArthur O'Dwyer    __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT
11493e519524SHoward Hinnant        : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
11503e519524SHoward Hinnant
115170d94c3fSArthur O'Dwyer    // When _IsConst=false, we have a user-provided copy constructor,
115270d94c3fSArthur O'Dwyer    // so we must also provide a copy assignment operator because
115370d94c3fSArthur O'Dwyer    // the implicit generation of a defaulted one is deprecated.
115470d94c3fSArthur O'Dwyer    // When _IsConst=true, the assignment operators are
115570d94c3fSArthur O'Dwyer    // implicitly generated and trivial.
1156*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
115770d94c3fSArthur O'Dwyer    __bit_iterator& operator=(const _If<_IsConst, struct __private_nat, __bit_iterator>& __it) {
115870d94c3fSArthur O'Dwyer        __seg_ = __it.__seg_;
115970d94c3fSArthur O'Dwyer        __ctz_ = __it.__ctz_;
116070d94c3fSArthur O'Dwyer        return *this;
116170d94c3fSArthur O'Dwyer    }
1162a829443cSEric Fiselier
1163*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 reference operator*() const _NOEXCEPT {
1164907ed12dSNikolas Klauser        return typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >
1165907ed12dSNikolas Klauser                ::type(__seg_, __storage_type(1) << __ctz_);
1166907ed12dSNikolas Klauser    }
11673e519524SHoward Hinnant
1168*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator& operator++()
11693e519524SHoward Hinnant    {
11703e519524SHoward Hinnant        if (__ctz_ != __bits_per_word-1)
11713e519524SHoward Hinnant            ++__ctz_;
11723e519524SHoward Hinnant        else
11733e519524SHoward Hinnant        {
11743e519524SHoward Hinnant            __ctz_ = 0;
11753e519524SHoward Hinnant            ++__seg_;
11763e519524SHoward Hinnant        }
11773e519524SHoward Hinnant        return *this;
11783e519524SHoward Hinnant    }
11793e519524SHoward Hinnant
1180*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator operator++(int)
11813e519524SHoward Hinnant    {
11823e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11833e519524SHoward Hinnant        ++(*this);
11843e519524SHoward Hinnant        return __tmp;
11853e519524SHoward Hinnant    }
11863e519524SHoward Hinnant
1187*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator& operator--()
11883e519524SHoward Hinnant    {
11893e519524SHoward Hinnant        if (__ctz_ != 0)
11903e519524SHoward Hinnant            --__ctz_;
11913e519524SHoward Hinnant        else
11923e519524SHoward Hinnant        {
11933e519524SHoward Hinnant            __ctz_ = __bits_per_word - 1;
11943e519524SHoward Hinnant            --__seg_;
11953e519524SHoward Hinnant        }
11963e519524SHoward Hinnant        return *this;
11973e519524SHoward Hinnant    }
11983e519524SHoward Hinnant
1199*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator operator--(int)
12003e519524SHoward Hinnant    {
12013e519524SHoward Hinnant        __bit_iterator __tmp = *this;
12023e519524SHoward Hinnant        --(*this);
12033e519524SHoward Hinnant        return __tmp;
12043e519524SHoward Hinnant    }
12053e519524SHoward Hinnant
1206*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator& operator+=(difference_type __n)
12073e519524SHoward Hinnant    {
12083e519524SHoward Hinnant        if (__n >= 0)
12093e519524SHoward Hinnant            __seg_ += (__n + __ctz_) / __bits_per_word;
12103e519524SHoward Hinnant        else
12113e519524SHoward Hinnant            __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
12123e519524SHoward Hinnant                    / static_cast<difference_type>(__bits_per_word);
12133e519524SHoward Hinnant        __n &= (__bits_per_word - 1);
12143e519524SHoward Hinnant        __ctz_ = static_cast<unsigned>((__n + __ctz_)  % __bits_per_word);
12153e519524SHoward Hinnant        return *this;
12163e519524SHoward Hinnant    }
12173e519524SHoward Hinnant
1218*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator& operator-=(difference_type __n)
12193e519524SHoward Hinnant    {
12203e519524SHoward Hinnant        return *this += -__n;
12213e519524SHoward Hinnant    }
12223e519524SHoward Hinnant
1223*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator operator+(difference_type __n) const
12243e519524SHoward Hinnant    {
12253e519524SHoward Hinnant        __bit_iterator __t(*this);
12263e519524SHoward Hinnant        __t += __n;
12273e519524SHoward Hinnant        return __t;
12283e519524SHoward Hinnant    }
12293e519524SHoward Hinnant
1230*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 __bit_iterator operator-(difference_type __n) const
12313e519524SHoward Hinnant    {
12323e519524SHoward Hinnant        __bit_iterator __t(*this);
12333e519524SHoward Hinnant        __t -= __n;
12343e519524SHoward Hinnant        return __t;
12353e519524SHoward Hinnant    }
12363e519524SHoward Hinnant
1237*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
12383e519524SHoward Hinnant    friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
12393e519524SHoward Hinnant
1240*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
12413e519524SHoward Hinnant    friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
12423e519524SHoward Hinnant        {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
12433e519524SHoward Hinnant
1244*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 reference operator[](difference_type __n) const {return *(*this + __n);}
12453e519524SHoward Hinnant
1246*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
12473e519524SHoward Hinnant        {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
12483e519524SHoward Hinnant
1249*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
12503e519524SHoward Hinnant        {return !(__x == __y);}
12513e519524SHoward Hinnant
1252*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
12533e519524SHoward Hinnant        {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
12543e519524SHoward Hinnant
1255*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
12563e519524SHoward Hinnant        {return __y < __x;}
12573e519524SHoward Hinnant
1258*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
12593e519524SHoward Hinnant        {return !(__y < __x);}
12603e519524SHoward Hinnant
1261*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
12623e519524SHoward Hinnant        {return !(__x < __y);}
12633e519524SHoward Hinnant
12643e519524SHoward Hinnantprivate:
1265*c74059c5SNikolas Klauser    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1266f86c2b6fSArthur O'Dwyer    explicit __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
1267d368a84cSHoward Hinnant        : __seg_(__s), __ctz_(__ctz) {}
12683e519524SHoward Hinnant
1269c003db1fSHoward Hinnant    friend typename _Cp::__self;
1270541f9e28SEric Fiselier
1271c003db1fSHoward Hinnant    friend class __bit_reference<_Cp>;
1272c003db1fSHoward Hinnant    friend class __bit_const_reference<_Cp>;
1273c003db1fSHoward Hinnant    friend class __bit_iterator<_Cp, true>;
1274c003db1fSHoward Hinnant    template <class _Dp> friend struct __bit_array;
1275*c74059c5SNikolas Klauser    template <class _Dp>
1276*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1277*c74059c5SNikolas Klauser    friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1278*c74059c5SNikolas Klauser
1279*c74059c5SNikolas Klauser    template <class _Dp>
1280*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1281*c74059c5SNikolas Klauser    friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
1282*c74059c5SNikolas Klauser
1283*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1284*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1285*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first,
1286c003db1fSHoward Hinnant                                                     __bit_iterator<_Dp, _IC> __last,
1287c003db1fSHoward Hinnant                                                     __bit_iterator<_Dp, false> __result);
1288*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1289*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1290*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first,
1291c003db1fSHoward Hinnant                                                       __bit_iterator<_Dp, _IC> __last,
1292c003db1fSHoward Hinnant                                                       __bit_iterator<_Dp, false> __result);
1293*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1294*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1295*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first,
1296c003db1fSHoward Hinnant                                           __bit_iterator<_Dp, _IC> __last,
1297c003db1fSHoward Hinnant                                           __bit_iterator<_Dp, false> __result);
1298*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1299*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1300*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first,
1301c003db1fSHoward Hinnant                                                              __bit_iterator<_Dp, _IC> __last,
1302c003db1fSHoward Hinnant                                                              __bit_iterator<_Dp, false> __result);
1303*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1304*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1305*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first,
1306c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, _IC> __last,
1307c003db1fSHoward Hinnant                                                                __bit_iterator<_Dp, false> __result);
1308*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1309*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1310*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first,
1311c003db1fSHoward Hinnant                                                    __bit_iterator<_Dp, _IC> __last,
1312c003db1fSHoward Hinnant                                                    __bit_iterator<_Dp, false> __result);
1313dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>,
1314dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C1, false>,
1315dbe81119SHoward Hinnant                                                                                           __bit_iterator<__C2, false>);
1316dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>,
1317dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C1, false>,
1318dbe81119SHoward Hinnant                                                                                             __bit_iterator<__C2, false>);
1319dbe81119SHoward Hinnant    template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>,
1320dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C1, false>,
1321dbe81119SHoward Hinnant                                                                                 __bit_iterator<__C2, false>);
1322*c74059c5SNikolas Klauser    template <class _Dp>
1323*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1324*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>,
1325c003db1fSHoward Hinnant                                             __bit_iterator<_Dp, false>,
1326c003db1fSHoward Hinnant                                             __bit_iterator<_Dp, false>);
1327*c74059c5SNikolas Klauser    template <class _Dp, bool _IC1, bool _IC2>
1328*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1329*c74059c5SNikolas Klauser    friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>,
13301237dccaSHoward Hinnant                                __bit_iterator<_Dp, _IC1>,
13311237dccaSHoward Hinnant                                __bit_iterator<_Dp, _IC2>);
1332*c74059c5SNikolas Klauser    template <class _Dp, bool _IC1, bool _IC2>
1333*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1334*c74059c5SNikolas Klauser    friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>,
13351237dccaSHoward Hinnant                                  __bit_iterator<_Dp, _IC1>,
13361237dccaSHoward Hinnant                                  __bit_iterator<_Dp, _IC2>);
1337*c74059c5SNikolas Klauser    template <class _Dp, bool _IC1, bool _IC2>
1338*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1339*c74059c5SNikolas Klauser    friend bool equal(__bit_iterator<_Dp, _IC1>,
1340c003db1fSHoward Hinnant                      __bit_iterator<_Dp, _IC1>,
1341c003db1fSHoward Hinnant                      __bit_iterator<_Dp, _IC2>);
1342*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1343*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1344*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
1345*c74059c5SNikolas Klauser    template <class _Dp, bool _IC>
1346*c74059c5SNikolas Klauser    _LIBCPP_CONSTEXPR_AFTER_CXX17
1347*c74059c5SNikolas Klauser    friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
1348423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1349423a8d77SHoward Hinnant                   __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
1350423a8d77SHoward Hinnant    template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
1351423a8d77SHoward Hinnant                   __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
13523e519524SHoward Hinnant};
13533e519524SHoward Hinnant
13543e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
13553e519524SHoward Hinnant
1356a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1357a016efb1SEric Fiselier
13583e519524SHoward Hinnant#endif // _LIBCPP___BIT_REFERENCE
1359