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