13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6*412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7*412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP___BIT_REFERENCE
123e519524SHoward Hinnant#define _LIBCPP___BIT_REFERENCE
133e519524SHoward Hinnant
143e519524SHoward Hinnant#include <__config>
153e519524SHoward Hinnant#include <algorithm>
163e519524SHoward Hinnant
173e519524SHoward Hinnant#pragma GCC system_header
183e519524SHoward Hinnant
193e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <class _C, bool _IsConst> class __bit_iterator;
223e519524SHoward Hinnanttemplate <class _C> class __bit_const_reference;
233e519524SHoward Hinnant
243e519524SHoward Hinnanttemplate <class _C>
253e519524SHoward Hinnantclass __bit_reference
263e519524SHoward Hinnant{
273e519524SHoward Hinnant    typedef typename _C::__storage_type    __storage_type;
283e519524SHoward Hinnant    typedef typename _C::__storage_pointer __storage_pointer;
293e519524SHoward Hinnant
303e519524SHoward Hinnant    __storage_pointer __seg_;
313e519524SHoward Hinnant    __storage_type    __mask_;
323e519524SHoward Hinnant
333e519524SHoward Hinnant#if defined(__clang__)
343e519524SHoward Hinnant    friend typename _C::__self;
353e519524SHoward Hinnant#else
363e519524SHoward Hinnant    friend class _C::__self;
373e519524SHoward Hinnant#endif
383e519524SHoward Hinnant    friend class __bit_const_reference<_C>;
393e519524SHoward Hinnant    friend class __bit_iterator<_C, false>;
403e519524SHoward Hinnantpublic:
413e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator bool() const {return static_cast<bool>(*__seg_ & __mask_);}
423e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator ~() const {return !static_cast<bool>(*this);}
433e519524SHoward Hinnant
443e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
453e519524SHoward Hinnant    __bit_reference& operator=(bool __x)
463e519524SHoward Hinnant    {
473e519524SHoward Hinnant        if (__x)
483e519524SHoward Hinnant            *__seg_ |= __mask_;
493e519524SHoward Hinnant        else
503e519524SHoward Hinnant            *__seg_ &= ~__mask_;
513e519524SHoward Hinnant        return *this;
523e519524SHoward Hinnant    }
533e519524SHoward Hinnant
543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
553e519524SHoward Hinnant    __bit_reference& operator=(const __bit_reference& __x) {return operator=(static_cast<bool>(__x));}
563e519524SHoward Hinnant
573e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void flip() {*__seg_ ^= __mask_;}
583e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_C, false> operator&() const
593e519524SHoward Hinnant        {return __bit_iterator<_C, false>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
603e519524SHoward Hinnantprivate:
613e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
623e519524SHoward Hinnant    __bit_reference(__storage_pointer __s, __storage_type __m) : __seg_(__s), __mask_(__m) {}
633e519524SHoward Hinnant};
643e519524SHoward Hinnant
653e519524SHoward Hinnanttemplate <class _C, class _D>
663e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
673e519524SHoward Hinnantvoid
683e519524SHoward Hinnantswap(__bit_reference<_C> __x, __bit_reference<_D> __y)
693e519524SHoward Hinnant{
703e519524SHoward Hinnant    bool __t = __x;
713e519524SHoward Hinnant    __x = __y;
723e519524SHoward Hinnant    __y = __t;
733e519524SHoward Hinnant}
743e519524SHoward Hinnant
753e519524SHoward Hinnanttemplate <class _C>
763e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
773e519524SHoward Hinnantvoid
783e519524SHoward Hinnantswap(__bit_reference<_C> __x, bool& __y)
793e519524SHoward Hinnant{
803e519524SHoward Hinnant    bool __t = __x;
813e519524SHoward Hinnant    __x = __y;
823e519524SHoward Hinnant    __y = __t;
833e519524SHoward Hinnant}
843e519524SHoward Hinnant
853e519524SHoward Hinnanttemplate <class _C>
863e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
873e519524SHoward Hinnantvoid
883e519524SHoward Hinnantswap(bool& __x, __bit_reference<_C> __y)
893e519524SHoward Hinnant{
903e519524SHoward Hinnant    bool __t = __x;
913e519524SHoward Hinnant    __x = __y;
923e519524SHoward Hinnant    __y = __t;
933e519524SHoward Hinnant}
943e519524SHoward Hinnant
953e519524SHoward Hinnanttemplate <class _C>
963e519524SHoward Hinnantclass __bit_const_reference
973e519524SHoward Hinnant{
983e519524SHoward Hinnant    typedef typename _C::__storage_type          __storage_type;
993e519524SHoward Hinnant    typedef typename _C::__const_storage_pointer __storage_pointer;
1003e519524SHoward Hinnant
1013e519524SHoward Hinnant    __storage_pointer        __seg_;
1023e519524SHoward Hinnant    __storage_type __mask_;
1033e519524SHoward Hinnant
1043e519524SHoward Hinnant#if defined(__clang__)
1053e519524SHoward Hinnant    friend typename _C::__self;
1063e519524SHoward Hinnant#else
1073e519524SHoward Hinnant    friend class _C::__self;
1083e519524SHoward Hinnant#endif
1093e519524SHoward Hinnant    friend class __bit_iterator<_C, true>;
1103e519524SHoward Hinnantpublic:
1113e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1123e519524SHoward Hinnant    __bit_const_reference(const __bit_reference<_C>& __x)
1133e519524SHoward Hinnant        : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
1143e519524SHoward Hinnant
1153e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator bool() const {return static_cast<bool>(*__seg_ & __mask_);}
1163e519524SHoward Hinnant
1173e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator<_C, true> operator&() const
1183e519524SHoward Hinnant        {return __bit_iterator<_C, true>(__seg_, static_cast<unsigned>(__ctz(__mask_)));}
1193e519524SHoward Hinnantprivate:
1203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1213e519524SHoward Hinnant    __bit_const_reference(__storage_pointer __s, __storage_type __m) : __seg_(__s), __mask_(__m) {}
1223e519524SHoward Hinnant
1233e519524SHoward Hinnant    __bit_const_reference& operator=(const __bit_const_reference& __x);
1243e519524SHoward Hinnant};
1253e519524SHoward Hinnant
1263e519524SHoward Hinnant// find
1273e519524SHoward Hinnant
1283e519524SHoward Hinnanttemplate <class _C>
1293e519524SHoward Hinnant__bit_iterator<_C, false>
1303e519524SHoward Hinnant__find_bool_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
1313e519524SHoward Hinnant{
1323e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
1333e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
1343e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
1353e519524SHoward Hinnant    // do first partial word
1363e519524SHoward Hinnant    if (__first.__ctz_ != 0)
1373e519524SHoward Hinnant    {
1383e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
1393e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
1403e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
1413e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1423e519524SHoward Hinnant        if (__b)
1433e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(__b)));
1443e519524SHoward Hinnant        __n -= __dn;
1453e519524SHoward Hinnant        ++__first.__seg_;
1463e519524SHoward Hinnant    }
1473e519524SHoward Hinnant    // do middle whole words
1483e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
1493e519524SHoward Hinnant        if (*__first.__seg_)
1503e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(*__first.__seg_)));
1513e519524SHoward Hinnant    // do last partial word
1523e519524SHoward Hinnant    if (__n > 0)
1533e519524SHoward Hinnant    {
1543e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
1553e519524SHoward Hinnant        __storage_type __b = *__first.__seg_ & __m;
1563e519524SHoward Hinnant        if (__b)
1573e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(__b)));
1583e519524SHoward Hinnant    }
1593e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
1603e519524SHoward Hinnant}
1613e519524SHoward Hinnant
1623e519524SHoward Hinnanttemplate <class _C>
1633e519524SHoward Hinnant__bit_iterator<_C, false>
1643e519524SHoward Hinnant__find_bool_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
1653e519524SHoward Hinnant{
1663e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
1673e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
1683e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
1693e519524SHoward Hinnant    // do first partial word
1703e519524SHoward Hinnant    if (__first.__ctz_ != 0)
1713e519524SHoward Hinnant    {
1723e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
1733e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
1743e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
1753e519524SHoward Hinnant        __storage_type __b = ~(*__first.__seg_ & __m);
1763e519524SHoward Hinnant        if (__b)
1773e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(__b)));
1783e519524SHoward Hinnant        __n -= __dn;
1793e519524SHoward Hinnant        ++__first.__seg_;
1803e519524SHoward Hinnant    }
1813e519524SHoward Hinnant    // do middle whole words
1823e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
1833e519524SHoward Hinnant    {
1843e519524SHoward Hinnant        __storage_type __b = ~*__first.__seg_;
1853e519524SHoward Hinnant        if (__b)
1863e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(__b)));
1873e519524SHoward Hinnant    }
1883e519524SHoward Hinnant    // do last partial word
1893e519524SHoward Hinnant    if (__n > 0)
1903e519524SHoward Hinnant    {
1913e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
1923e519524SHoward Hinnant        __storage_type __b = ~(*__first.__seg_ & __m);
1933e519524SHoward Hinnant        if (__b)
1943e519524SHoward Hinnant            return _It(__first.__seg_, static_cast<unsigned>(_STD::__ctz(__b)));
1953e519524SHoward Hinnant    }
1963e519524SHoward Hinnant    return _It(__first.__seg_, static_cast<unsigned>(__n));
1973e519524SHoward Hinnant}
1983e519524SHoward Hinnant
1993e519524SHoward Hinnanttemplate <class _C, class _Tp>
2003e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2013e519524SHoward Hinnant__bit_iterator<_C, false>
2023e519524SHoward Hinnantfind(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, const _Tp& __value)
2033e519524SHoward Hinnant{
2043e519524SHoward Hinnant    if (static_cast<bool>(__value))
2053e519524SHoward Hinnant        return __find_bool_true(__first, static_cast<typename _C::size_type>(__last - __first));
2063e519524SHoward Hinnant    return __find_bool_false(__first, static_cast<typename _C::size_type>(__last - __first));
2073e519524SHoward Hinnant}
2083e519524SHoward Hinnant
2093e519524SHoward Hinnant// count
2103e519524SHoward Hinnant
2113e519524SHoward Hinnanttemplate <class _C>
2123e519524SHoward Hinnanttypename __bit_iterator<_C, false>::difference_type
2133e519524SHoward Hinnant__count_bool_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
2143e519524SHoward Hinnant{
2153e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
2163e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2173e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
2183e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
2193e519524SHoward Hinnant    difference_type __r = 0;
2203e519524SHoward Hinnant    // do first partial word
2213e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2223e519524SHoward Hinnant    {
2233e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
2243e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
2253e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
2263e519524SHoward Hinnant        __r = _STD::__pop_count(*__first.__seg_ & __m);
2273e519524SHoward Hinnant        __n -= __dn;
2283e519524SHoward Hinnant        ++__first.__seg_;
2293e519524SHoward Hinnant    }
2303e519524SHoward Hinnant    // do middle whole words
2313e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2323e519524SHoward Hinnant        __r += _STD::__pop_count(*__first.__seg_);
2333e519524SHoward Hinnant    // do last partial word
2343e519524SHoward Hinnant    if (__n > 0)
2353e519524SHoward Hinnant    {
2363e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
2373e519524SHoward Hinnant        __r += _STD::__pop_count(*__first.__seg_ & __m);
2383e519524SHoward Hinnant    }
2393e519524SHoward Hinnant    return __r;
2403e519524SHoward Hinnant}
2413e519524SHoward Hinnant
2423e519524SHoward Hinnanttemplate <class _C>
2433e519524SHoward Hinnanttypename __bit_iterator<_C, false>::difference_type
2443e519524SHoward Hinnant__count_bool_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
2453e519524SHoward Hinnant{
2463e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
2473e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2483e519524SHoward Hinnant    typedef typename _It::difference_type difference_type;
2493e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
2503e519524SHoward Hinnant    difference_type __r = 0;
2513e519524SHoward Hinnant    // do first partial word
2523e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2533e519524SHoward Hinnant    {
2543e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
2553e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
2563e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
2573e519524SHoward Hinnant        __r = _STD::__pop_count(~(*__first.__seg_ & __m));
2583e519524SHoward Hinnant        __n -= __dn;
2593e519524SHoward Hinnant        ++__first.__seg_;
2603e519524SHoward Hinnant    }
2613e519524SHoward Hinnant    // do middle whole words
2623e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
2633e519524SHoward Hinnant        __r += _STD::__pop_count(~*__first.__seg_);
2643e519524SHoward Hinnant    // do last partial word
2653e519524SHoward Hinnant    if (__n > 0)
2663e519524SHoward Hinnant    {
2673e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
2683e519524SHoward Hinnant        __r += _STD::__pop_count(~(*__first.__seg_ & __m));
2693e519524SHoward Hinnant    }
2703e519524SHoward Hinnant    return __r;
2713e519524SHoward Hinnant}
2723e519524SHoward Hinnant
2733e519524SHoward Hinnanttemplate <class _C, class _Tp>
2743e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2753e519524SHoward Hinnanttypename __bit_iterator<_C, false>::difference_type
2763e519524SHoward Hinnantcount(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, const _Tp& __value)
2773e519524SHoward Hinnant{
2783e519524SHoward Hinnant    if (static_cast<bool>(__value))
2793e519524SHoward Hinnant        return __count_bool_true(__first, static_cast<typename _C::size_type>(__last - __first));
2803e519524SHoward Hinnant    return __count_bool_false(__first, static_cast<typename _C::size_type>(__last - __first));
2813e519524SHoward Hinnant}
2823e519524SHoward Hinnant
2833e519524SHoward Hinnant// fill_n
2843e519524SHoward Hinnant
2853e519524SHoward Hinnanttemplate <class _C>
2863e519524SHoward Hinnantvoid
2873e519524SHoward Hinnant__fill_n_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
2883e519524SHoward Hinnant{
2893e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
2903e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
2913e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
2923e519524SHoward Hinnant    // do first partial word
2933e519524SHoward Hinnant    if (__first.__ctz_ != 0)
2943e519524SHoward Hinnant    {
2953e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
2963e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
2973e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
2983e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
2993e519524SHoward Hinnant        __n -= __dn;
3003e519524SHoward Hinnant        ++__first.__seg_;
3013e519524SHoward Hinnant    }
3023e519524SHoward Hinnant    // do middle whole words
3033e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3043e519524SHoward Hinnant    _STD::memset(__first.__seg_, 0, __nw * sizeof(__storage_type));
3053e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3063e519524SHoward Hinnant    // do last partial word
3073e519524SHoward Hinnant    if (__n > 0)
3083e519524SHoward Hinnant    {
3093e519524SHoward Hinnant        __first.__seg_ += __nw;
3103e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3113e519524SHoward Hinnant        *__first.__seg_ &= ~__m;
3123e519524SHoward Hinnant    }
3133e519524SHoward Hinnant}
3143e519524SHoward Hinnant
3153e519524SHoward Hinnanttemplate <class _C>
3163e519524SHoward Hinnantvoid
3173e519524SHoward Hinnant__fill_n_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
3183e519524SHoward Hinnant{
3193e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _It;
3203e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
3213e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
3223e519524SHoward Hinnant    // do first partial word
3233e519524SHoward Hinnant    if (__first.__ctz_ != 0)
3243e519524SHoward Hinnant    {
3253e519524SHoward Hinnant        __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
3263e519524SHoward Hinnant        __storage_type __dn = _STD::min(__clz_f, __n);
3273e519524SHoward Hinnant        __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
3283e519524SHoward Hinnant        *__first.__seg_ |= __m;
3293e519524SHoward Hinnant        __n -= __dn;
3303e519524SHoward Hinnant        ++__first.__seg_;
3313e519524SHoward Hinnant    }
3323e519524SHoward Hinnant    // do middle whole words
3333e519524SHoward Hinnant    __storage_type __nw = __n / __bits_per_word;
3343e519524SHoward Hinnant    _STD::memset(__first.__seg_, -1, __nw * sizeof(__storage_type));
3353e519524SHoward Hinnant    __n -= __nw * __bits_per_word;
3363e519524SHoward Hinnant    // do last partial word
3373e519524SHoward Hinnant    if (__n > 0)
3383e519524SHoward Hinnant    {
3393e519524SHoward Hinnant        __first.__seg_ += __nw;
3403e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3413e519524SHoward Hinnant        *__first.__seg_ |= __m;
3423e519524SHoward Hinnant    }
3433e519524SHoward Hinnant}
3443e519524SHoward Hinnant
3453e519524SHoward Hinnanttemplate <class _C>
3463e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
3473e519524SHoward Hinnantvoid
3483e519524SHoward Hinnantfill_n(__bit_iterator<_C, false> __first, typename _C::size_type __n, bool __value)
3493e519524SHoward Hinnant{
3503e519524SHoward Hinnant    if (__n > 0)
3513e519524SHoward Hinnant    {
3523e519524SHoward Hinnant        if (__value)
3533e519524SHoward Hinnant            __fill_n_true(__first, __n);
3543e519524SHoward Hinnant        else
3553e519524SHoward Hinnant            __fill_n_false(__first, __n);
3563e519524SHoward Hinnant    }
3573e519524SHoward Hinnant}
3583e519524SHoward Hinnant
3593e519524SHoward Hinnant// fill
3603e519524SHoward Hinnant
3613e519524SHoward Hinnanttemplate <class _C>
3623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3633e519524SHoward Hinnantvoid
3643e519524SHoward Hinnantfill(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, bool __value)
3653e519524SHoward Hinnant{
3663e519524SHoward Hinnant    _STD::fill_n(__first, static_cast<typename _C::size_type>(__last - __first), __value);
3673e519524SHoward Hinnant}
3683e519524SHoward Hinnant
3693e519524SHoward Hinnant// copy
3703e519524SHoward Hinnant
3713e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
3723e519524SHoward Hinnant__bit_iterator<_C, false>
3733e519524SHoward Hinnant__copy_aligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
3743e519524SHoward Hinnant                                                     __bit_iterator<_C, false> __result)
3753e519524SHoward Hinnant{
3763e519524SHoward Hinnant    typedef __bit_iterator<_C, _IsConst> _In;
3773e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
3783e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
3793e519524SHoward Hinnant    static const unsigned __bits_per_word = _In::__bits_per_word;
3803e519524SHoward Hinnant    difference_type __n = __last - __first;
3813e519524SHoward Hinnant    if (__n > 0)
3823e519524SHoward Hinnant    {
3833e519524SHoward Hinnant        // do first word
3843e519524SHoward Hinnant        if (__first.__ctz_ != 0)
3853e519524SHoward Hinnant        {
3863e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
3873e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz), __n);
3883e519524SHoward Hinnant            __n -= __dn;
3893e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
3903e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
3913e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
3923e519524SHoward Hinnant            *__result.__seg_ |= __b;
3933e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
3943e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
3953e519524SHoward Hinnant            ++__first.__seg_;
3963e519524SHoward Hinnant            // __first.__ctz_ = 0;
3973e519524SHoward Hinnant        }
3983e519524SHoward Hinnant        // __first.__ctz_ == 0;
3993e519524SHoward Hinnant        // do middle words
4003e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
4013e519524SHoward Hinnant        _STD::memmove(__result.__seg_, __first.__seg_, __nw * sizeof(__storage_type));
4023e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
4033e519524SHoward Hinnant        __result.__seg_ += __nw;
4043e519524SHoward Hinnant        // do last word
4053e519524SHoward Hinnant        if (__n > 0)
4063e519524SHoward Hinnant        {
4073e519524SHoward Hinnant            __first.__seg_ += __nw;
4083e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4093e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4103e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4113e519524SHoward Hinnant            *__result.__seg_ |= __b;
4123e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
4133e519524SHoward Hinnant        }
4143e519524SHoward Hinnant    }
4153e519524SHoward Hinnant    return __result;
4163e519524SHoward Hinnant}
4173e519524SHoward Hinnant
4183e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
4193e519524SHoward Hinnant__bit_iterator<_C, false>
4203e519524SHoward Hinnant__copy_unaligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
4213e519524SHoward Hinnant                                                       __bit_iterator<_C, false> __result)
4223e519524SHoward Hinnant{
4233e519524SHoward Hinnant    typedef __bit_iterator<_C, _IsConst> _In;
4243e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
4253e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
4263e519524SHoward Hinnant    static const unsigned __bits_per_word = _In::__bits_per_word;
4273e519524SHoward Hinnant    difference_type __n = __last - __first;
4283e519524SHoward Hinnant    if (__n > 0)
4293e519524SHoward Hinnant    {
4303e519524SHoward Hinnant        // do first word
4313e519524SHoward Hinnant        if (__first.__ctz_ != 0)
4323e519524SHoward Hinnant        {
4333e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
4343e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz_f), __n);
4353e519524SHoward Hinnant            __n -= __dn;
4363e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
4373e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4383e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
4393e519524SHoward Hinnant            __storage_type __ddn = _STD::min<__storage_type>(__dn, __clz_r);
4403e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
4413e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4423e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
4433e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
4443e519524SHoward Hinnant            else
4453e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
4463e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
4473e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
4483e519524SHoward Hinnant            __dn -= __ddn;
4493e519524SHoward Hinnant            if (__dn > 0)
4503e519524SHoward Hinnant            {
4513e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
4523e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
4533e519524SHoward Hinnant                *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
4543e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
4553e519524SHoward Hinnant            }
4563e519524SHoward Hinnant            ++__first.__seg_;
4573e519524SHoward Hinnant            // __first.__ctz_ = 0;
4583e519524SHoward Hinnant        }
4593e519524SHoward Hinnant        // __first.__ctz_ == 0;
4603e519524SHoward Hinnant        // do middle words
4613e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
4623e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
4633e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
4643e519524SHoward Hinnant        {
4653e519524SHoward Hinnant            __storage_type __b = *__first.__seg_;
4663e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4673e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
4683e519524SHoward Hinnant            ++__result.__seg_;
4693e519524SHoward Hinnant            *__result.__seg_ &= __m;
4703e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
4713e519524SHoward Hinnant        }
4723e519524SHoward Hinnant        // do last word
4733e519524SHoward Hinnant        if (__n > 0)
4743e519524SHoward Hinnant        {
4753e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
4763e519524SHoward Hinnant            __storage_type __b = *__first.__seg_ & __m;
4773e519524SHoward Hinnant            __storage_type __dn = _STD::min(__n, static_cast<difference_type>(__clz_r));
4783e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
4793e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
4803e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
4813e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
4823e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
4833e519524SHoward Hinnant            __n -= __dn;
4843e519524SHoward Hinnant            if (__n > 0)
4853e519524SHoward Hinnant            {
4863e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
4873e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
4883e519524SHoward Hinnant                *__result.__seg_ |= __b >> __dn;
4893e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
4903e519524SHoward Hinnant            }
4913e519524SHoward Hinnant        }
4923e519524SHoward Hinnant    }
4933e519524SHoward Hinnant    return __result;
4943e519524SHoward Hinnant}
4953e519524SHoward Hinnant
4963e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
4973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4983e519524SHoward Hinnant__bit_iterator<_C, false>
4993e519524SHoward Hinnantcopy(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
5003e519524SHoward Hinnant{
5013e519524SHoward Hinnant    if (__first.__ctz_ == __result.__ctz_)
5023e519524SHoward Hinnant        return __copy_aligned(__first, __last, __result);
5033e519524SHoward Hinnant    return __copy_unaligned(__first, __last, __result);
5043e519524SHoward Hinnant}
5053e519524SHoward Hinnant
5063e519524SHoward Hinnant// copy_backward
5073e519524SHoward Hinnant
5083e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
5093e519524SHoward Hinnant__bit_iterator<_C, false>
5103e519524SHoward Hinnant__copy_backward_aligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
5113e519524SHoward Hinnant                                                     __bit_iterator<_C, false> __result)
5123e519524SHoward Hinnant{
5133e519524SHoward Hinnant    typedef __bit_iterator<_C, _IsConst> _In;
5143e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
5153e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
5163e519524SHoward Hinnant    static const unsigned __bits_per_word = _In::__bits_per_word;
5173e519524SHoward Hinnant    difference_type __n = __last - __first;
5183e519524SHoward Hinnant    if (__n > 0)
5193e519524SHoward Hinnant    {
5203e519524SHoward Hinnant        // do first word
5213e519524SHoward Hinnant        if (__last.__ctz_ != 0)
5223e519524SHoward Hinnant        {
5233e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__last.__ctz_), __n);
5243e519524SHoward Hinnant            __n -= __dn;
5253e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __last.__ctz_;
5263e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
5273e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
5283e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
5293e519524SHoward Hinnant            *__result.__seg_ |= __b;
5303e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
5313e519524SHoward Hinnant                                                       __result.__ctz_)  % __bits_per_word);
5323e519524SHoward Hinnant            // __last.__ctz_ = 0
5333e519524SHoward Hinnant         }
5343e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
5353e519524SHoward Hinnant        // __result.__ctz_ == 0 || __n == 0
5363e519524SHoward Hinnant        // do middle words
5373e519524SHoward Hinnant        __storage_type __nw = __n / __bits_per_word;
5383e519524SHoward Hinnant        __result.__seg_ -= __nw;
5393e519524SHoward Hinnant        __last.__seg_ -= __nw;
5403e519524SHoward Hinnant        _STD::memmove(__result.__seg_, __last.__seg_, __nw * sizeof(__storage_type));
5413e519524SHoward Hinnant        __n -= __nw * __bits_per_word;
5423e519524SHoward Hinnant        // do last word
5433e519524SHoward Hinnant        if (__n > 0)
5443e519524SHoward Hinnant        {
5453e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
5463e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
5473e519524SHoward Hinnant            *--__result.__seg_ &= ~__m;
5483e519524SHoward Hinnant            *__result.__seg_ |= __b;
5493e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
5503e519524SHoward Hinnant        }
5513e519524SHoward Hinnant    }
5523e519524SHoward Hinnant    return __result;
5533e519524SHoward Hinnant}
5543e519524SHoward Hinnant
5553e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
5563e519524SHoward Hinnant__bit_iterator<_C, false>
5573e519524SHoward Hinnant__copy_backward_unaligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
5583e519524SHoward Hinnant                                                       __bit_iterator<_C, false> __result)
5593e519524SHoward Hinnant{
5603e519524SHoward Hinnant    typedef __bit_iterator<_C, _IsConst> _In;
5613e519524SHoward Hinnant    typedef  typename _In::difference_type difference_type;
5623e519524SHoward Hinnant    typedef typename _In::__storage_type __storage_type;
5633e519524SHoward Hinnant    static const unsigned __bits_per_word = _In::__bits_per_word;
5643e519524SHoward Hinnant    difference_type __n = __last - __first;
5653e519524SHoward Hinnant    if (__n > 0)
5663e519524SHoward Hinnant    {
5673e519524SHoward Hinnant        // do first word
5683e519524SHoward Hinnant        if (__last.__ctz_ != 0)
5693e519524SHoward Hinnant        {
5703e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__last.__ctz_), __n);
5713e519524SHoward Hinnant            __n -= __dn;
5723e519524SHoward Hinnant            unsigned __clz_l = __bits_per_word - __last.__ctz_;
5733e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
5743e519524SHoward Hinnant            __storage_type __b = *__last.__seg_ & __m;
5753e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
5763e519524SHoward Hinnant            __storage_type __ddn = _STD::min(__dn, static_cast<difference_type>(__result.__ctz_));
5773e519524SHoward Hinnant            if (__ddn > 0)
5783e519524SHoward Hinnant            {
5793e519524SHoward Hinnant                __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
5803e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5813e519524SHoward Hinnant                if (__result.__ctz_ > __last.__ctz_)
5823e519524SHoward Hinnant                    *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
5833e519524SHoward Hinnant                else
5843e519524SHoward Hinnant                    *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
5853e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
5863e519524SHoward Hinnant                                                         __result.__ctz_)  % __bits_per_word);
5873e519524SHoward Hinnant                __dn -= __ddn;
5883e519524SHoward Hinnant            }
5893e519524SHoward Hinnant            if (__dn > 0)
5903e519524SHoward Hinnant            {
5913e519524SHoward Hinnant                // __result.__ctz_ == 0
5923e519524SHoward Hinnant                --__result.__seg_;
5933e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
5943e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
5953e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
5963e519524SHoward Hinnant                __last.__ctz_ -= __dn + __ddn;
5973e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
5983e519524SHoward Hinnant            }
5993e519524SHoward Hinnant            // __last.__ctz_ = 0
6003e519524SHoward Hinnant         }
6013e519524SHoward Hinnant        // __last.__ctz_ == 0 || __n == 0
6023e519524SHoward Hinnant        // __result.__ctz_ != 0 || __n == 0
6033e519524SHoward Hinnant        // do middle words
6043e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
6053e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> __clz_r;
6063e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word)
6073e519524SHoward Hinnant        {
6083e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_;
6093e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6103e519524SHoward Hinnant            *__result.__seg_ |= __b >> __clz_r;
6113e519524SHoward Hinnant            *--__result.__seg_ &= __m;
6123e519524SHoward Hinnant            *__result.__seg_ |= __b << __result.__ctz_;
6133e519524SHoward Hinnant        }
6143e519524SHoward Hinnant        // do last word
6153e519524SHoward Hinnant        if (__n > 0)
6163e519524SHoward Hinnant        {
6173e519524SHoward Hinnant            __m = ~__storage_type(0) << (__bits_per_word - __n);
6183e519524SHoward Hinnant            __storage_type __b = *--__last.__seg_ & __m;
6193e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
6203e519524SHoward Hinnant            __storage_type __dn = _STD::min(__n, static_cast<difference_type>(__result.__ctz_));
6213e519524SHoward Hinnant            __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
6223e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6233e519524SHoward Hinnant            *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
6243e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
6253e519524SHoward Hinnant                                                     __result.__ctz_)  % __bits_per_word);
6263e519524SHoward Hinnant            __n -= __dn;
6273e519524SHoward Hinnant            if (__n > 0)
6283e519524SHoward Hinnant            {
6293e519524SHoward Hinnant                // __result.__ctz_ == 0
6303e519524SHoward Hinnant                --__result.__seg_;
6313e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
6323e519524SHoward Hinnant                __m = ~__storage_type(0) << __result.__ctz_;
6333e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
6343e519524SHoward Hinnant                *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
6353e519524SHoward Hinnant            }
6363e519524SHoward Hinnant        }
6373e519524SHoward Hinnant    }
6383e519524SHoward Hinnant    return __result;
6393e519524SHoward Hinnant}
6403e519524SHoward Hinnant
6413e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
6423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6433e519524SHoward Hinnant__bit_iterator<_C, false>
6443e519524SHoward Hinnantcopy_backward(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
6453e519524SHoward Hinnant{
6463e519524SHoward Hinnant    if (__last.__ctz_ == __result.__ctz_)
6473e519524SHoward Hinnant        return __copy_backward_aligned(__first, __last, __result);
6483e519524SHoward Hinnant    return __copy_backward_unaligned(__first, __last, __result);
6493e519524SHoward Hinnant}
6503e519524SHoward Hinnant
6513e519524SHoward Hinnant// move
6523e519524SHoward Hinnant
6533e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
6543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6553e519524SHoward Hinnant__bit_iterator<_C, false>
6563e519524SHoward Hinnantmove(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
6573e519524SHoward Hinnant{
6583e519524SHoward Hinnant    return _STD::copy(__first, __last, __result);
6593e519524SHoward Hinnant}
6603e519524SHoward Hinnant
6613e519524SHoward Hinnant// move_backward
6623e519524SHoward Hinnant
6633e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
6643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6653e519524SHoward Hinnant__bit_iterator<_C, false>
6663e519524SHoward Hinnantmove_backward(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
6673e519524SHoward Hinnant{
6683e519524SHoward Hinnant    return _STD::copy(__first, __last, __result);
6693e519524SHoward Hinnant}
6703e519524SHoward Hinnant
6713e519524SHoward Hinnant// swap_ranges
6723e519524SHoward Hinnant
6733e519524SHoward Hinnanttemplate <class _C1, class _C2>
6743e519524SHoward Hinnant__bit_iterator<_C2, false>
6753e519524SHoward Hinnant__swap_ranges_aligned(__bit_iterator<_C1, false> __first, __bit_iterator<_C1, false> __last,
6763e519524SHoward Hinnant                      __bit_iterator<_C2, false> __result)
6773e519524SHoward Hinnant{
6783e519524SHoward Hinnant    typedef __bit_iterator<_C1, false> _I1;
6793e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
6803e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
6813e519524SHoward Hinnant    static const unsigned __bits_per_word = _I1::__bits_per_word;
6823e519524SHoward Hinnant    difference_type __n = __last - __first;
6833e519524SHoward Hinnant    if (__n > 0)
6843e519524SHoward Hinnant    {
6853e519524SHoward Hinnant        // do first word
6863e519524SHoward Hinnant        if (__first.__ctz_ != 0)
6873e519524SHoward Hinnant        {
6883e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first.__ctz_;
6893e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz), __n);
6903e519524SHoward Hinnant            __n -= __dn;
6913e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
6923e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
6933e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
6943e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
6953e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
6963e519524SHoward Hinnant            *__result.__seg_ |= __b1;
6973e519524SHoward Hinnant            *__first.__seg_  |= __b2;
6983e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
6993e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
7003e519524SHoward Hinnant            ++__first.__seg_;
7013e519524SHoward Hinnant            // __first.__ctz_ = 0;
7023e519524SHoward Hinnant        }
7033e519524SHoward Hinnant        // __first.__ctz_ == 0;
7043e519524SHoward Hinnant        // do middle words
7053e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
7063e519524SHoward Hinnant            swap(*__first.__seg_, *__result.__seg_);
7073e519524SHoward Hinnant        // do last word
7083e519524SHoward Hinnant        if (__n > 0)
7093e519524SHoward Hinnant        {
7103e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
7113e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7123e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7133e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7143e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7153e519524SHoward Hinnant            *__result.__seg_ |= __b1;
7163e519524SHoward Hinnant            *__first.__seg_  |= __b2;
7173e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>(__n);
7183e519524SHoward Hinnant        }
7193e519524SHoward Hinnant    }
7203e519524SHoward Hinnant    return __result;
7213e519524SHoward Hinnant}
7223e519524SHoward Hinnant
7233e519524SHoward Hinnanttemplate <class _C1, class _C2>
7243e519524SHoward Hinnant__bit_iterator<_C2, false>
7253e519524SHoward Hinnant__swap_ranges_unaligned(__bit_iterator<_C1, false> __first, __bit_iterator<_C1, false> __last,
7263e519524SHoward Hinnant                        __bit_iterator<_C2, false> __result)
7273e519524SHoward Hinnant{
7283e519524SHoward Hinnant    typedef __bit_iterator<_C1, false> _I1;
7293e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
7303e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
7313e519524SHoward Hinnant    static const unsigned __bits_per_word = _I1::__bits_per_word;
7323e519524SHoward Hinnant    difference_type __n = __last - __first;
7333e519524SHoward Hinnant    if (__n > 0)
7343e519524SHoward Hinnant    {
7353e519524SHoward Hinnant        // do first word
7363e519524SHoward Hinnant        if (__first.__ctz_ != 0)
7373e519524SHoward Hinnant        {
7383e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first.__ctz_;
7393e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz_f), __n);
7403e519524SHoward Hinnant            __n -= __dn;
7413e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
7423e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7433e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
7443e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __result.__ctz_;
7453e519524SHoward Hinnant            __storage_type __ddn = _STD::min<__storage_type>(__dn, __clz_r);
7463e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
7473e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7483e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7493e519524SHoward Hinnant            if (__result.__ctz_ > __first.__ctz_)
7503e519524SHoward Hinnant            {
7513e519524SHoward Hinnant                unsigned __s = __result.__ctz_ - __first.__ctz_;
7523e519524SHoward Hinnant                *__result.__seg_ |= __b1 << __s;
7533e519524SHoward Hinnant                *__first.__seg_  |= __b2 >> __s;
7543e519524SHoward Hinnant            }
7553e519524SHoward Hinnant            else
7563e519524SHoward Hinnant            {
7573e519524SHoward Hinnant                unsigned __s = __first.__ctz_ - __result.__ctz_;
7583e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
7593e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
7603e519524SHoward Hinnant            }
7613e519524SHoward Hinnant            __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
7623e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_)  % __bits_per_word);
7633e519524SHoward Hinnant            __dn -= __ddn;
7643e519524SHoward Hinnant            if (__dn > 0)
7653e519524SHoward Hinnant            {
7663e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
7673e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
7683e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
7693e519524SHoward Hinnant                unsigned __s = __first.__ctz_ + __ddn;
7703e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __s;
7713e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __s;
7723e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__dn);
7733e519524SHoward Hinnant            }
7743e519524SHoward Hinnant            ++__first.__seg_;
7753e519524SHoward Hinnant            // __first.__ctz_ = 0;
7763e519524SHoward Hinnant        }
7773e519524SHoward Hinnant        // __first.__ctz_ == 0;
7783e519524SHoward Hinnant        // do middle words
7793e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __result.__ctz_;
7803e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __result.__ctz_;
7813e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
7823e519524SHoward Hinnant        {
7833e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_;
7843e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
7853e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
7863e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
7873e519524SHoward Hinnant            *__first.__seg_  = __b2 >> __result.__ctz_;
7883e519524SHoward Hinnant            ++__result.__seg_;
7893e519524SHoward Hinnant            __b2 = *__result.__seg_ & ~__m;
7903e519524SHoward Hinnant            *__result.__seg_ &= __m;
7913e519524SHoward Hinnant            *__result.__seg_ |= __b1 >> __clz_r;
7923e519524SHoward Hinnant            *__first.__seg_  |= __b2 << __clz_r;
7933e519524SHoward Hinnant        }
7943e519524SHoward Hinnant        // do last word
7953e519524SHoward Hinnant        if (__n > 0)
7963e519524SHoward Hinnant        {
7973e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
7983e519524SHoward Hinnant            __storage_type __b1 = *__first.__seg_ & __m;
7993e519524SHoward Hinnant            *__first.__seg_ &= ~__m;
8003e519524SHoward Hinnant            __storage_type __dn = _STD::min<__storage_type>(__n, __clz_r);
8013e519524SHoward Hinnant            __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
8023e519524SHoward Hinnant            __storage_type __b2 = *__result.__seg_ & __m;
8033e519524SHoward Hinnant            *__result.__seg_ &= ~__m;
8043e519524SHoward Hinnant            *__result.__seg_ |= __b1 << __result.__ctz_;
8053e519524SHoward Hinnant            *__first.__seg_  |= __b2 >> __result.__ctz_;
8063e519524SHoward Hinnant            __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
8073e519524SHoward Hinnant            __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_)  % __bits_per_word);
8083e519524SHoward Hinnant            __n -= __dn;
8093e519524SHoward Hinnant            if (__n > 0)
8103e519524SHoward Hinnant            {
8113e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
8123e519524SHoward Hinnant                __b2 = *__result.__seg_ & __m;
8133e519524SHoward Hinnant                *__result.__seg_ &= ~__m;
8143e519524SHoward Hinnant                *__result.__seg_ |= __b1 >> __dn;
8153e519524SHoward Hinnant                *__first.__seg_  |= __b2 << __dn;
8163e519524SHoward Hinnant                __result.__ctz_ = static_cast<unsigned>(__n);
8173e519524SHoward Hinnant            }
8183e519524SHoward Hinnant        }
8193e519524SHoward Hinnant    }
8203e519524SHoward Hinnant    return __result;
8213e519524SHoward Hinnant}
8223e519524SHoward Hinnant
8233e519524SHoward Hinnanttemplate <class _C1, class _C2>
8243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8253e519524SHoward Hinnant__bit_iterator<_C2, false>
8263e519524SHoward Hinnantswap_ranges(__bit_iterator<_C1, false> __first1, __bit_iterator<_C1, false> __last1,
8273e519524SHoward Hinnant            __bit_iterator<_C2, false> __first2)
8283e519524SHoward Hinnant{
8293e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
8303e519524SHoward Hinnant        return __swap_ranges_aligned(__first1, __last1, __first2);
8313e519524SHoward Hinnant    return __swap_ranges_unaligned(__first1, __last1, __first2);
8323e519524SHoward Hinnant}
8333e519524SHoward Hinnant
8343e519524SHoward Hinnant// rotate
8353e519524SHoward Hinnant
8363e519524SHoward Hinnanttemplate <class _C>
8373e519524SHoward Hinnantstruct __bit_array
8383e519524SHoward Hinnant{
8393e519524SHoward Hinnant    typedef typename _C::difference_type difference_type;
8403e519524SHoward Hinnant    typedef typename _C::__storage_type  __storage_type;
8413e519524SHoward Hinnant    typedef typename _C::iterator        iterator;
8423e519524SHoward Hinnant    static const unsigned __bits_per_word = _C::__bits_per_word;
8433e519524SHoward Hinnant    static const unsigned _N = 4;
8443e519524SHoward Hinnant
8453e519524SHoward Hinnant    difference_type __size_;
8463e519524SHoward Hinnant    __storage_type __word_[_N];
8473e519524SHoward Hinnant
8483e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
8493e519524SHoward Hinnant        {return static_cast<difference_type>(_N * __bits_per_word);}
8503e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
8513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__word_, 0);}
8523e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator end()   {return iterator(__word_ + __size_ / __bits_per_word,
8533e519524SHoward Hinnant                                                  static_cast<unsigned>(__size_ % __bits_per_word));}
8543e519524SHoward Hinnant};
8553e519524SHoward Hinnant
8563e519524SHoward Hinnanttemplate <class _C>
8573e519524SHoward Hinnant__bit_iterator<_C, false>
8583e519524SHoward Hinnantrotate(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __middle, __bit_iterator<_C, false> __last)
8593e519524SHoward Hinnant{
8603e519524SHoward Hinnant    typedef __bit_iterator<_C, false> _I1;
8613e519524SHoward Hinnant    typedef  typename _I1::difference_type difference_type;
8623e519524SHoward Hinnant    typedef typename _I1::__storage_type __storage_type;
8633e519524SHoward Hinnant    static const unsigned __bits_per_word = _I1::__bits_per_word;
8643e519524SHoward Hinnant    difference_type __d1 = __middle - __first;
8653e519524SHoward Hinnant    difference_type __d2 = __last - __middle;
8663e519524SHoward Hinnant    _I1 __r = __first + __d2;
8673e519524SHoward Hinnant    while (__d1 != 0 && __d2 != 0)
8683e519524SHoward Hinnant    {
8693e519524SHoward Hinnant        if (__d1 <= __d2)
8703e519524SHoward Hinnant        {
8713e519524SHoward Hinnant            if (__d1 <= __bit_array<_C>::capacity())
8723e519524SHoward Hinnant            {
8733e519524SHoward Hinnant                __bit_array<_C> __b(__d1);
8743e519524SHoward Hinnant                _STD::copy(__first, __middle, __b.begin());
8753e519524SHoward Hinnant                _STD::copy(__b.begin(), __b.end(), _STD::copy(__middle, __last, __first));
8763e519524SHoward Hinnant                break;
8773e519524SHoward Hinnant            }
8783e519524SHoward Hinnant            else
8793e519524SHoward Hinnant            {
8803e519524SHoward Hinnant                __bit_iterator<_C, false> __mp = _STD::swap_ranges(__first, __middle, __middle);
8813e519524SHoward Hinnant                __first = __middle;
8823e519524SHoward Hinnant                __middle = __mp;
8833e519524SHoward Hinnant                __d2 -= __d1;
8843e519524SHoward Hinnant            }
8853e519524SHoward Hinnant        }
8863e519524SHoward Hinnant        else
8873e519524SHoward Hinnant        {
8883e519524SHoward Hinnant            if (__d2 <= __bit_array<_C>::capacity())
8893e519524SHoward Hinnant            {
8903e519524SHoward Hinnant                __bit_array<_C> __b(__d2);
8913e519524SHoward Hinnant                _STD::copy(__middle, __last, __b.begin());
8923e519524SHoward Hinnant                _STD::copy_backward(__b.begin(), __b.end(), _STD::copy_backward(__first, __middle, __last));
8933e519524SHoward Hinnant                break;
8943e519524SHoward Hinnant            }
8953e519524SHoward Hinnant            else
8963e519524SHoward Hinnant            {
8973e519524SHoward Hinnant                __bit_iterator<_C, false> __mp = __first + __d2;
8983e519524SHoward Hinnant                _STD::swap_ranges(__first, __mp, __middle);
8993e519524SHoward Hinnant                __first = __mp;
9003e519524SHoward Hinnant                __d1 -= __d2;
9013e519524SHoward Hinnant            }
9023e519524SHoward Hinnant        }
9033e519524SHoward Hinnant    }
9043e519524SHoward Hinnant    return __r;
9053e519524SHoward Hinnant}
9063e519524SHoward Hinnant
9073e519524SHoward Hinnant// equal
9083e519524SHoward Hinnant
9093e519524SHoward Hinnanttemplate <class _C>
9103e519524SHoward Hinnantbool
9113e519524SHoward Hinnant__equal_unaligned(__bit_iterator<_C, true> __first1, __bit_iterator<_C, true> __last1,
9123e519524SHoward Hinnant                  __bit_iterator<_C, true> __first2)
9133e519524SHoward Hinnant{
9143e519524SHoward Hinnant    typedef __bit_iterator<_C, true> _It;
9153e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
9163e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
9173e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
9183e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
9193e519524SHoward Hinnant    if (__n > 0)
9203e519524SHoward Hinnant    {
9213e519524SHoward Hinnant        // do first word
9223e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
9233e519524SHoward Hinnant        {
9243e519524SHoward Hinnant            unsigned __clz_f = __bits_per_word - __first1.__ctz_;
9253e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz_f), __n);
9263e519524SHoward Hinnant            __n -= __dn;
9273e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
9283e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
9293e519524SHoward Hinnant            unsigned __clz_r = __bits_per_word - __first2.__ctz_;
9303e519524SHoward Hinnant            __storage_type __ddn = _STD::min<__storage_type>(__dn, __clz_r);
9313e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
9323e519524SHoward Hinnant            if (__first2.__ctz_ > __first1.__ctz_)
9333e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
9343e519524SHoward Hinnant                    return false;
9353e519524SHoward Hinnant            else
9363e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
9373e519524SHoward Hinnant                    return false;
9383e519524SHoward Hinnant            __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
9393e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_)  % __bits_per_word);
9403e519524SHoward Hinnant            __dn -= __ddn;
9413e519524SHoward Hinnant            if (__dn > 0)
9423e519524SHoward Hinnant            {
9433e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __dn);
9443e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
9453e519524SHoward Hinnant                    return false;
9463e519524SHoward Hinnant                __first2.__ctz_ = static_cast<unsigned>(__dn);
9473e519524SHoward Hinnant            }
9483e519524SHoward Hinnant            ++__first1.__seg_;
9493e519524SHoward Hinnant            // __first1.__ctz_ = 0;
9503e519524SHoward Hinnant        }
9513e519524SHoward Hinnant        // __first1.__ctz_ == 0;
9523e519524SHoward Hinnant        // do middle words
9533e519524SHoward Hinnant        unsigned __clz_r = __bits_per_word - __first2.__ctz_;
9543e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
9553e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
9563e519524SHoward Hinnant        {
9573e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_;
9583e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
9593e519524SHoward Hinnant                return false;
9603e519524SHoward Hinnant            ++__first2.__seg_;
9613e519524SHoward Hinnant            if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
9623e519524SHoward Hinnant                return false;
9633e519524SHoward Hinnant        }
9643e519524SHoward Hinnant        // do last word
9653e519524SHoward Hinnant        if (__n > 0)
9663e519524SHoward Hinnant        {
9673e519524SHoward Hinnant            __m = ~__storage_type(0) >> (__bits_per_word - __n);
9683e519524SHoward Hinnant            __storage_type __b = *__first1.__seg_ & __m;
9693e519524SHoward Hinnant            __storage_type __dn = _STD::min(__n, static_cast<difference_type>(__clz_r));
9703e519524SHoward Hinnant            __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
9713e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
9723e519524SHoward Hinnant                return false;
9733e519524SHoward Hinnant            __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
9743e519524SHoward Hinnant            __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_)  % __bits_per_word);
9753e519524SHoward Hinnant            __n -= __dn;
9763e519524SHoward Hinnant            if (__n > 0)
9773e519524SHoward Hinnant            {
9783e519524SHoward Hinnant                __m = ~__storage_type(0) >> (__bits_per_word - __n);
9793e519524SHoward Hinnant                if ((*__first2.__seg_ & __m) != (__b >> __dn))
9803e519524SHoward Hinnant                    return false;
9813e519524SHoward Hinnant            }
9823e519524SHoward Hinnant        }
9833e519524SHoward Hinnant    }
9843e519524SHoward Hinnant    return true;
9853e519524SHoward Hinnant}
9863e519524SHoward Hinnant
9873e519524SHoward Hinnanttemplate <class _C>
9883e519524SHoward Hinnantbool
9893e519524SHoward Hinnant__equal_aligned(__bit_iterator<_C, true> __first1, __bit_iterator<_C, true> __last1,
9903e519524SHoward Hinnant                __bit_iterator<_C, true> __first2)
9913e519524SHoward Hinnant{
9923e519524SHoward Hinnant    typedef __bit_iterator<_C, true> _It;
9933e519524SHoward Hinnant    typedef  typename _It::difference_type difference_type;
9943e519524SHoward Hinnant    typedef typename _It::__storage_type __storage_type;
9953e519524SHoward Hinnant    static const unsigned __bits_per_word = _It::__bits_per_word;
9963e519524SHoward Hinnant    difference_type __n = __last1 - __first1;
9973e519524SHoward Hinnant    if (__n > 0)
9983e519524SHoward Hinnant    {
9993e519524SHoward Hinnant        // do first word
10003e519524SHoward Hinnant        if (__first1.__ctz_ != 0)
10013e519524SHoward Hinnant        {
10023e519524SHoward Hinnant            unsigned __clz = __bits_per_word - __first1.__ctz_;
10033e519524SHoward Hinnant            difference_type __dn = _STD::min(static_cast<difference_type>(__clz), __n);
10043e519524SHoward Hinnant            __n -= __dn;
10053e519524SHoward Hinnant            __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
10063e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10073e519524SHoward Hinnant                return false;
10083e519524SHoward Hinnant            ++__first2.__seg_;
10093e519524SHoward Hinnant            ++__first1.__seg_;
10103e519524SHoward Hinnant            // __first1.__ctz_ = 0;
10113e519524SHoward Hinnant            // __first2.__ctz_ = 0;
10123e519524SHoward Hinnant        }
10133e519524SHoward Hinnant        // __first1.__ctz_ == 0;
10143e519524SHoward Hinnant        // __first2.__ctz_ == 0;
10153e519524SHoward Hinnant        // do middle words
10163e519524SHoward Hinnant        for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
10173e519524SHoward Hinnant            if (*__first2.__seg_ != *__first1.__seg_)
10183e519524SHoward Hinnant                return false;
10193e519524SHoward Hinnant        // do last word
10203e519524SHoward Hinnant        if (__n > 0)
10213e519524SHoward Hinnant        {
10223e519524SHoward Hinnant            __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
10233e519524SHoward Hinnant            if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
10243e519524SHoward Hinnant                return false;
10253e519524SHoward Hinnant        }
10263e519524SHoward Hinnant    }
10273e519524SHoward Hinnant    return true;
10283e519524SHoward Hinnant}
10293e519524SHoward Hinnant
10303e519524SHoward Hinnanttemplate <class _C, bool _IC1, bool _IC2>
103143d99238SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10323e519524SHoward Hinnantbool
10333e519524SHoward Hinnantequal(__bit_iterator<_C, _IC1> __first1, __bit_iterator<_C, _IC1> __last1, __bit_iterator<_C, _IC2> __first2)
10343e519524SHoward Hinnant{
10353e519524SHoward Hinnant    if (__first1.__ctz_ == __first2.__ctz_)
10363e519524SHoward Hinnant        return __equal_aligned(__first1, __last1, __first2);
10373e519524SHoward Hinnant    return __equal_unaligned(__first1, __last1, __first2);
10383e519524SHoward Hinnant}
10393e519524SHoward Hinnant
10403e519524SHoward Hinnanttemplate <class _C, bool _IsConst>
10413e519524SHoward Hinnantclass __bit_iterator
10423e519524SHoward Hinnant{
10433e519524SHoward Hinnantpublic:
10443e519524SHoward Hinnant    typedef typename _C::difference_type                                                          difference_type;
10453e519524SHoward Hinnant    typedef bool                                                                                  value_type;
10463e519524SHoward Hinnant    typedef __bit_iterator                                                                        pointer;
10473e519524SHoward Hinnant    typedef typename conditional<_IsConst, __bit_const_reference<_C>, __bit_reference<_C> >::type reference;
10483e519524SHoward Hinnant    typedef random_access_iterator_tag                                                            iterator_category;
10493e519524SHoward Hinnant
10503e519524SHoward Hinnantprivate:
10513e519524SHoward Hinnant    typedef typename _C::__storage_type                                           __storage_type;
10523e519524SHoward Hinnant    typedef typename conditional<_IsConst, typename _C::__const_storage_pointer,
10533e519524SHoward Hinnant                                           typename _C::__storage_pointer>::type  __storage_pointer;
10543e519524SHoward Hinnant    static const unsigned __bits_per_word = _C::__bits_per_word;
10553e519524SHoward Hinnant
10563e519524SHoward Hinnant    __storage_pointer __seg_;
10573e519524SHoward Hinnant    unsigned          __ctz_;
10583e519524SHoward Hinnant
10593e519524SHoward Hinnantpublic:
10603e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator() {}
10613e519524SHoward Hinnant
10623e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator(const __bit_iterator<_C, false>& __it)
10633e519524SHoward Hinnant        : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
10643e519524SHoward Hinnant
10653e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const {return reference(__seg_, __storage_type(1) << __ctz_);}
10663e519524SHoward Hinnant
10673e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
10683e519524SHoward Hinnant    {
10693e519524SHoward Hinnant        if (__ctz_ != __bits_per_word-1)
10703e519524SHoward Hinnant            ++__ctz_;
10713e519524SHoward Hinnant        else
10723e519524SHoward Hinnant        {
10733e519524SHoward Hinnant            __ctz_ = 0;
10743e519524SHoward Hinnant            ++__seg_;
10753e519524SHoward Hinnant        }
10763e519524SHoward Hinnant        return *this;
10773e519524SHoward Hinnant    }
10783e519524SHoward Hinnant
10793e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int)
10803e519524SHoward Hinnant    {
10813e519524SHoward Hinnant        __bit_iterator __tmp = *this;
10823e519524SHoward Hinnant        ++(*this);
10833e519524SHoward Hinnant        return __tmp;
10843e519524SHoward Hinnant    }
10853e519524SHoward Hinnant
10863e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--()
10873e519524SHoward Hinnant    {
10883e519524SHoward Hinnant        if (__ctz_ != 0)
10893e519524SHoward Hinnant            --__ctz_;
10903e519524SHoward Hinnant        else
10913e519524SHoward Hinnant        {
10923e519524SHoward Hinnant            __ctz_ = __bits_per_word - 1;
10933e519524SHoward Hinnant            --__seg_;
10943e519524SHoward Hinnant        }
10953e519524SHoward Hinnant        return *this;
10963e519524SHoward Hinnant    }
10973e519524SHoward Hinnant
10983e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int)
10993e519524SHoward Hinnant    {
11003e519524SHoward Hinnant        __bit_iterator __tmp = *this;
11013e519524SHoward Hinnant        --(*this);
11023e519524SHoward Hinnant        return __tmp;
11033e519524SHoward Hinnant    }
11043e519524SHoward Hinnant
11053e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n)
11063e519524SHoward Hinnant    {
11073e519524SHoward Hinnant        if (__n >= 0)
11083e519524SHoward Hinnant            __seg_ += (__n + __ctz_) / __bits_per_word;
11093e519524SHoward Hinnant        else
11103e519524SHoward Hinnant            __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
11113e519524SHoward Hinnant                    / static_cast<difference_type>(__bits_per_word);
11123e519524SHoward Hinnant        __n &= (__bits_per_word - 1);
11133e519524SHoward Hinnant        __ctz_ = static_cast<unsigned>((__n + __ctz_)  % __bits_per_word);
11143e519524SHoward Hinnant        return *this;
11153e519524SHoward Hinnant    }
11163e519524SHoward Hinnant
11173e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n)
11183e519524SHoward Hinnant    {
11193e519524SHoward Hinnant        return *this += -__n;
11203e519524SHoward Hinnant    }
11213e519524SHoward Hinnant
11223e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const
11233e519524SHoward Hinnant    {
11243e519524SHoward Hinnant        __bit_iterator __t(*this);
11253e519524SHoward Hinnant        __t += __n;
11263e519524SHoward Hinnant        return __t;
11273e519524SHoward Hinnant    }
11283e519524SHoward Hinnant
11293e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const
11303e519524SHoward Hinnant    {
11313e519524SHoward Hinnant        __bit_iterator __t(*this);
11323e519524SHoward Hinnant        __t -= __n;
11333e519524SHoward Hinnant        return __t;
11343e519524SHoward Hinnant    }
11353e519524SHoward Hinnant
11363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11373e519524SHoward Hinnant    friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
11383e519524SHoward Hinnant
11393e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11403e519524SHoward Hinnant    friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
11413e519524SHoward Hinnant        {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
11423e519524SHoward Hinnant
11433e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);}
11443e519524SHoward Hinnant
11453e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
11463e519524SHoward Hinnant        {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
11473e519524SHoward Hinnant
11483e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
11493e519524SHoward Hinnant        {return !(__x == __y);}
11503e519524SHoward Hinnant
11513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
11523e519524SHoward Hinnant        {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
11533e519524SHoward Hinnant
11543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
11553e519524SHoward Hinnant        {return __y < __x;}
11563e519524SHoward Hinnant
11573e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
11583e519524SHoward Hinnant        {return !(__y < __x);}
11593e519524SHoward Hinnant
11603e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
11613e519524SHoward Hinnant        {return !(__x < __y);}
11623e519524SHoward Hinnant
11633e519524SHoward Hinnantprivate:
11643e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11653e519524SHoward Hinnant    __bit_iterator(__storage_pointer __s, unsigned __ctz) : __seg_(__s), __ctz_(__ctz) {}
11663e519524SHoward Hinnant
11673e519524SHoward Hinnant#if defined(__clang__)
11683e519524SHoward Hinnant    friend typename _C::__self;
11693e519524SHoward Hinnant#else
11703e519524SHoward Hinnant    friend class _C::__self;
11713e519524SHoward Hinnant#endif
11723e519524SHoward Hinnant    friend class __bit_reference<_C>;
11733e519524SHoward Hinnant    friend class __bit_const_reference<_C>;
11743e519524SHoward Hinnant    friend class __bit_iterator<_C, true>;
11753e519524SHoward Hinnant    template <class _D> friend struct __bit_array;
11763e519524SHoward Hinnant    template <class _D> friend void __fill_n_false(__bit_iterator<_D, false> __first, typename _D::size_type __n);
11773e519524SHoward Hinnant    template <class _D> friend void __fill_n_true(__bit_iterator<_D, false> __first, typename _D::size_type __n);
11783e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_aligned(__bit_iterator<_D, _IC> __first,
11793e519524SHoward Hinnant                                                                                  __bit_iterator<_D, _IC> __last,
11803e519524SHoward Hinnant                                                                                  __bit_iterator<_D, false> __result);
11813e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_unaligned(__bit_iterator<_D, _IC> __first,
11823e519524SHoward Hinnant                                                                                    __bit_iterator<_D, _IC> __last,
11833e519524SHoward Hinnant                                                                                    __bit_iterator<_D, false> __result);
11843e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> copy(__bit_iterator<_D, _IC> __first,
11853e519524SHoward Hinnant                                                                        __bit_iterator<_D, _IC> __last,
11863e519524SHoward Hinnant                                                                        __bit_iterator<_D, false> __result);
11873e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_backward_aligned(__bit_iterator<_D, _IC> __first,
11883e519524SHoward Hinnant                                                                                           __bit_iterator<_D, _IC> __last,
11893e519524SHoward Hinnant                                                                                           __bit_iterator<_D, false> __result);
11903e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_backward_unaligned(__bit_iterator<_D, _IC> __first,
11913e519524SHoward Hinnant                                                                                             __bit_iterator<_D, _IC> __last,
11923e519524SHoward Hinnant                                                                                             __bit_iterator<_D, false> __result);
11933e519524SHoward Hinnant    template <class _D, bool _IC> friend __bit_iterator<_D, false> copy_backward(__bit_iterator<_D, _IC> __first,
11943e519524SHoward Hinnant                                                                                 __bit_iterator<_D, _IC> __last,
11953e519524SHoward Hinnant                                                                                 __bit_iterator<_D, false> __result);
11963e519524SHoward Hinnant    template <class _C1, class _C2>friend __bit_iterator<_C2, false> __swap_ranges_aligned(__bit_iterator<_C1, false>,
11973e519524SHoward Hinnant                                                                                           __bit_iterator<_C1, false>,
11983e519524SHoward Hinnant                                                                                           __bit_iterator<_C2, false>);
11993e519524SHoward Hinnant    template <class _C1, class _C2>friend __bit_iterator<_C2, false> __swap_ranges_unaligned(__bit_iterator<_C1, false>,
12003e519524SHoward Hinnant                                                                                             __bit_iterator<_C1, false>,
12013e519524SHoward Hinnant                                                                                             __bit_iterator<_C2, false>);
12023e519524SHoward Hinnant    template <class _C1, class _C2>friend __bit_iterator<_C2, false> swap_ranges(__bit_iterator<_C1, false>,
12033e519524SHoward Hinnant                                                                                 __bit_iterator<_C1, false>,
12043e519524SHoward Hinnant                                                                                 __bit_iterator<_C2, false>);
12053e519524SHoward Hinnant    template <class _D> friend __bit_iterator<_D, false> rotate(__bit_iterator<_D, false>,
12063e519524SHoward Hinnant                                                                __bit_iterator<_D, false>,
12073e519524SHoward Hinnant                                                                __bit_iterator<_D, false>);
12083e519524SHoward Hinnant    template <class _D> friend bool __equal_aligned(__bit_iterator<_D, true>,
12093e519524SHoward Hinnant                                                    __bit_iterator<_D, true>,
12103e519524SHoward Hinnant                                                    __bit_iterator<_D, true>);
12113e519524SHoward Hinnant    template <class _D> friend bool __equal_unaligned(__bit_iterator<_D, true>,
12123e519524SHoward Hinnant                                                      __bit_iterator<_D, true>,
12133e519524SHoward Hinnant                                                      __bit_iterator<_D, true>);
12143e519524SHoward Hinnant    template <class _D, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_D, _IC1>,
12153e519524SHoward Hinnant                                                                __bit_iterator<_D, _IC1>,
12163e519524SHoward Hinnant                                                                __bit_iterator<_D, _IC2>);
12173e519524SHoward Hinnant    template <class _D> friend __bit_iterator<_D, false> __find_bool_true(__bit_iterator<_D, false>,
12183e519524SHoward Hinnant                                                                          typename _D::size_type);
12193e519524SHoward Hinnant    template <class _D> friend __bit_iterator<_D, false> __find_bool_false(__bit_iterator<_D, false>,
12203e519524SHoward Hinnant                                                                           typename _D::size_type);
12213e519524SHoward Hinnant};
12223e519524SHoward Hinnant
12233e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
12243e519524SHoward Hinnant
12253e519524SHoward Hinnant#endif  // _LIBCPP___BIT_REFERENCE
1226