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