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