__bit_reference 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #ifndef _LIBCPP___BIT_REFERENCE
  10. #define _LIBCPP___BIT_REFERENCE
  11. #include <__algorithm/copy_n.h>
  12. #include <__algorithm/fill_n.h>
  13. #include <__algorithm/min.h>
  14. #include <__bit/countr.h>
  15. #include <__bit/invert_if.h>
  16. #include <__bit/popcount.h>
  17. #include <__config>
  18. #include <__fwd/bit_reference.h>
  19. #include <__iterator/iterator_traits.h>
  20. #include <__memory/construct_at.h>
  21. #include <__memory/pointer_traits.h>
  22. #include <__type_traits/conditional.h>
  23. #include <__utility/swap.h>
  24. #include <cstring>
  25. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  26. # pragma GCC system_header
  27. #endif
  28. _LIBCPP_PUSH_MACROS
  29. #include <__undef_macros>
  30. _LIBCPP_BEGIN_NAMESPACE_STD
  31. template <class _Cp>
  32. class __bit_const_reference;
  33. template <class _Tp>
  34. struct __has_storage_type {
  35. static const bool value = false;
  36. };
  37. template <class _Cp, bool = __has_storage_type<_Cp>::value>
  38. class __bit_reference {
  39. using __storage_type = typename _Cp::__storage_type;
  40. using __storage_pointer = typename _Cp::__storage_pointer;
  41. __storage_pointer __seg_;
  42. __storage_type __mask_;
  43. friend typename _Cp::__self;
  44. friend class __bit_const_reference<_Cp>;
  45. friend class __bit_iterator<_Cp, false>;
  46. public:
  47. using __container = typename _Cp::__self;
  48. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_reference(const __bit_reference&) = default;
  49. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 operator bool() const _NOEXCEPT {
  50. return static_cast<bool>(*__seg_ & __mask_);
  51. }
  52. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool operator~() const _NOEXCEPT {
  53. return !static_cast<bool>(*this);
  54. }
  55. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_reference& operator=(bool __x) _NOEXCEPT {
  56. if (__x)
  57. *__seg_ |= __mask_;
  58. else
  59. *__seg_ &= ~__mask_;
  60. return *this;
  61. }
  62. #if _LIBCPP_STD_VER >= 23
  63. _LIBCPP_HIDE_FROM_ABI constexpr const __bit_reference& operator=(bool __x) const noexcept {
  64. if (__x)
  65. *__seg_ |= __mask_;
  66. else
  67. *__seg_ &= ~__mask_;
  68. return *this;
  69. }
  70. #endif
  71. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT {
  72. return operator=(static_cast<bool>(__x));
  73. }
  74. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void flip() _NOEXCEPT { *__seg_ ^= __mask_; }
  75. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false> operator&() const _NOEXCEPT {
  76. return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(std::__libcpp_ctz(__mask_)));
  77. }
  78. private:
  79. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit __bit_reference(
  80. __storage_pointer __s, __storage_type __m) _NOEXCEPT
  81. : __seg_(__s),
  82. __mask_(__m) {}
  83. };
  84. template <class _Cp>
  85. class __bit_reference<_Cp, false> {};
  86. template <class _Cp>
  87. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
  88. swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT {
  89. bool __t = __x;
  90. __x = __y;
  91. __y = __t;
  92. }
  93. template <class _Cp, class _Dp>
  94. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
  95. swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT {
  96. bool __t = __x;
  97. __x = __y;
  98. __y = __t;
  99. }
  100. template <class _Cp>
  101. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT {
  102. bool __t = __x;
  103. __x = __y;
  104. __y = __t;
  105. }
  106. template <class _Cp>
  107. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT {
  108. bool __t = __x;
  109. __x = __y;
  110. __y = __t;
  111. }
  112. template <class _Cp>
  113. class __bit_const_reference {
  114. using __storage_type = typename _Cp::__storage_type;
  115. using __storage_pointer = typename _Cp::__const_storage_pointer;
  116. __storage_pointer __seg_;
  117. __storage_type __mask_;
  118. friend typename _Cp::__self;
  119. friend class __bit_iterator<_Cp, true>;
  120. public:
  121. using __container = typename _Cp::__self;
  122. _LIBCPP_HIDE_FROM_ABI __bit_const_reference(const __bit_const_reference&) = default;
  123. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
  124. : __seg_(__x.__seg_),
  125. __mask_(__x.__mask_) {}
  126. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT {
  127. return static_cast<bool>(*__seg_ & __mask_);
  128. }
  129. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, true> operator&() const _NOEXCEPT {
  130. return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(std::__libcpp_ctz(__mask_)));
  131. }
  132. private:
  133. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __bit_const_reference(
  134. __storage_pointer __s, __storage_type __m) _NOEXCEPT
  135. : __seg_(__s),
  136. __mask_(__m) {}
  137. __bit_const_reference& operator=(const __bit_const_reference&) = delete;
  138. };
  139. // copy
  140. template <class _Cp, bool _IsConst>
  141. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_aligned(
  142. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  143. using _In = __bit_iterator<_Cp, _IsConst>;
  144. using difference_type = typename _In::difference_type;
  145. using __storage_type = typename _In::__storage_type;
  146. const int __bits_per_word = _In::__bits_per_word;
  147. difference_type __n = __last - __first;
  148. if (__n > 0) {
  149. // do first word
  150. if (__first.__ctz_ != 0) {
  151. unsigned __clz = __bits_per_word - __first.__ctz_;
  152. difference_type __dn = std::min(static_cast<difference_type>(__clz), __n);
  153. __n -= __dn;
  154. __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
  155. __storage_type __b = *__first.__seg_ & __m;
  156. *__result.__seg_ &= ~__m;
  157. *__result.__seg_ |= __b;
  158. __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
  159. __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
  160. ++__first.__seg_;
  161. // __first.__ctz_ = 0;
  162. }
  163. // __first.__ctz_ == 0;
  164. // do middle words
  165. __storage_type __nw = __n / __bits_per_word;
  166. std::copy_n(std::__to_address(__first.__seg_), __nw, std::__to_address(__result.__seg_));
  167. __n -= __nw * __bits_per_word;
  168. __result.__seg_ += __nw;
  169. // do last word
  170. if (__n > 0) {
  171. __first.__seg_ += __nw;
  172. __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
  173. __storage_type __b = *__first.__seg_ & __m;
  174. *__result.__seg_ &= ~__m;
  175. *__result.__seg_ |= __b;
  176. __result.__ctz_ = static_cast<unsigned>(__n);
  177. }
  178. }
  179. return __result;
  180. }
  181. template <class _Cp, bool _IsConst>
  182. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned(
  183. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  184. using _In = __bit_iterator<_Cp, _IsConst>;
  185. using difference_type = typename _In::difference_type;
  186. using __storage_type = typename _In::__storage_type;
  187. const int __bits_per_word = _In::__bits_per_word;
  188. difference_type __n = __last - __first;
  189. if (__n > 0) {
  190. // do first word
  191. if (__first.__ctz_ != 0) {
  192. unsigned __clz_f = __bits_per_word - __first.__ctz_;
  193. difference_type __dn = std::min(static_cast<difference_type>(__clz_f), __n);
  194. __n -= __dn;
  195. __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
  196. __storage_type __b = *__first.__seg_ & __m;
  197. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  198. __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r);
  199. __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
  200. *__result.__seg_ &= ~__m;
  201. if (__result.__ctz_ > __first.__ctz_)
  202. *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
  203. else
  204. *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
  205. __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
  206. __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
  207. __dn -= __ddn;
  208. if (__dn > 0) {
  209. __m = ~__storage_type(0) >> (__bits_per_word - __dn);
  210. *__result.__seg_ &= ~__m;
  211. *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
  212. __result.__ctz_ = static_cast<unsigned>(__dn);
  213. }
  214. ++__first.__seg_;
  215. // __first.__ctz_ = 0;
  216. }
  217. // __first.__ctz_ == 0;
  218. // do middle words
  219. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  220. __storage_type __m = ~__storage_type(0) << __result.__ctz_;
  221. for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) {
  222. __storage_type __b = *__first.__seg_;
  223. *__result.__seg_ &= ~__m;
  224. *__result.__seg_ |= __b << __result.__ctz_;
  225. ++__result.__seg_;
  226. *__result.__seg_ &= __m;
  227. *__result.__seg_ |= __b >> __clz_r;
  228. }
  229. // do last word
  230. if (__n > 0) {
  231. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  232. __storage_type __b = *__first.__seg_ & __m;
  233. __storage_type __dn = std::min(__n, static_cast<difference_type>(__clz_r));
  234. __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
  235. *__result.__seg_ &= ~__m;
  236. *__result.__seg_ |= __b << __result.__ctz_;
  237. __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
  238. __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
  239. __n -= __dn;
  240. if (__n > 0) {
  241. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  242. *__result.__seg_ &= ~__m;
  243. *__result.__seg_ |= __b >> __dn;
  244. __result.__ctz_ = static_cast<unsigned>(__n);
  245. }
  246. }
  247. }
  248. return __result;
  249. }
  250. template <class _Cp, bool _IsConst>
  251. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false>
  252. copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  253. if (__first.__ctz_ == __result.__ctz_)
  254. return std::__copy_aligned(__first, __last, __result);
  255. return std::__copy_unaligned(__first, __last, __result);
  256. }
  257. // copy_backward
  258. template <class _Cp, bool _IsConst>
  259. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_backward_aligned(
  260. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  261. using _In = __bit_iterator<_Cp, _IsConst>;
  262. using difference_type = typename _In::difference_type;
  263. using __storage_type = typename _In::__storage_type;
  264. const int __bits_per_word = _In::__bits_per_word;
  265. difference_type __n = __last - __first;
  266. if (__n > 0) {
  267. // do first word
  268. if (__last.__ctz_ != 0) {
  269. difference_type __dn = std::min(static_cast<difference_type>(__last.__ctz_), __n);
  270. __n -= __dn;
  271. unsigned __clz = __bits_per_word - __last.__ctz_;
  272. __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
  273. __storage_type __b = *__last.__seg_ & __m;
  274. *__result.__seg_ &= ~__m;
  275. *__result.__seg_ |= __b;
  276. __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
  277. // __last.__ctz_ = 0
  278. }
  279. // __last.__ctz_ == 0 || __n == 0
  280. // __result.__ctz_ == 0 || __n == 0
  281. // do middle words
  282. __storage_type __nw = __n / __bits_per_word;
  283. __result.__seg_ -= __nw;
  284. __last.__seg_ -= __nw;
  285. std::copy_n(std::__to_address(__last.__seg_), __nw, std::__to_address(__result.__seg_));
  286. __n -= __nw * __bits_per_word;
  287. // do last word
  288. if (__n > 0) {
  289. __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
  290. __storage_type __b = *--__last.__seg_ & __m;
  291. *--__result.__seg_ &= ~__m;
  292. *__result.__seg_ |= __b;
  293. __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
  294. }
  295. }
  296. return __result;
  297. }
  298. template <class _Cp, bool _IsConst>
  299. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_backward_unaligned(
  300. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  301. using _In = __bit_iterator<_Cp, _IsConst>;
  302. using difference_type = typename _In::difference_type;
  303. using __storage_type = typename _In::__storage_type;
  304. const int __bits_per_word = _In::__bits_per_word;
  305. difference_type __n = __last - __first;
  306. if (__n > 0) {
  307. // do first word
  308. if (__last.__ctz_ != 0) {
  309. difference_type __dn = std::min(static_cast<difference_type>(__last.__ctz_), __n);
  310. __n -= __dn;
  311. unsigned __clz_l = __bits_per_word - __last.__ctz_;
  312. __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
  313. __storage_type __b = *__last.__seg_ & __m;
  314. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  315. __storage_type __ddn = std::min(__dn, static_cast<difference_type>(__result.__ctz_));
  316. if (__ddn > 0) {
  317. __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
  318. *__result.__seg_ &= ~__m;
  319. if (__result.__ctz_ > __last.__ctz_)
  320. *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
  321. else
  322. *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
  323. __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
  324. __dn -= __ddn;
  325. }
  326. if (__dn > 0) {
  327. // __result.__ctz_ == 0
  328. --__result.__seg_;
  329. __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
  330. __m = ~__storage_type(0) << __result.__ctz_;
  331. *__result.__seg_ &= ~__m;
  332. __last.__ctz_ -= __dn + __ddn;
  333. *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
  334. }
  335. // __last.__ctz_ = 0
  336. }
  337. // __last.__ctz_ == 0 || __n == 0
  338. // __result.__ctz_ != 0 || __n == 0
  339. // do middle words
  340. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  341. __storage_type __m = ~__storage_type(0) >> __clz_r;
  342. for (; __n >= __bits_per_word; __n -= __bits_per_word) {
  343. __storage_type __b = *--__last.__seg_;
  344. *__result.__seg_ &= ~__m;
  345. *__result.__seg_ |= __b >> __clz_r;
  346. *--__result.__seg_ &= __m;
  347. *__result.__seg_ |= __b << __result.__ctz_;
  348. }
  349. // do last word
  350. if (__n > 0) {
  351. __m = ~__storage_type(0) << (__bits_per_word - __n);
  352. __storage_type __b = *--__last.__seg_ & __m;
  353. __clz_r = __bits_per_word - __result.__ctz_;
  354. __storage_type __dn = std::min(__n, static_cast<difference_type>(__result.__ctz_));
  355. __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
  356. *__result.__seg_ &= ~__m;
  357. *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
  358. __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
  359. __n -= __dn;
  360. if (__n > 0) {
  361. // __result.__ctz_ == 0
  362. --__result.__seg_;
  363. __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
  364. __m = ~__storage_type(0) << __result.__ctz_;
  365. *__result.__seg_ &= ~__m;
  366. *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
  367. }
  368. }
  369. }
  370. return __result;
  371. }
  372. template <class _Cp, bool _IsConst>
  373. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false> copy_backward(
  374. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  375. if (__last.__ctz_ == __result.__ctz_)
  376. return std::__copy_backward_aligned(__first, __last, __result);
  377. return std::__copy_backward_unaligned(__first, __last, __result);
  378. }
  379. // move
  380. template <class _Cp, bool _IsConst>
  381. inline _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false>
  382. move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  383. return std::copy(__first, __last, __result);
  384. }
  385. // move_backward
  386. template <class _Cp, bool _IsConst>
  387. inline _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> move_backward(
  388. __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
  389. return std::copy_backward(__first, __last, __result);
  390. }
  391. // swap_ranges
  392. template <class _Cl, class _Cr>
  393. _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> __swap_ranges_aligned(
  394. __bit_iterator<_Cl, false> __first, __bit_iterator<_Cl, false> __last, __bit_iterator<_Cr, false> __result) {
  395. using _I1 = __bit_iterator<_Cl, false>;
  396. using difference_type = typename _I1::difference_type;
  397. using __storage_type = typename _I1::__storage_type;
  398. const int __bits_per_word = _I1::__bits_per_word;
  399. difference_type __n = __last - __first;
  400. if (__n > 0) {
  401. // do first word
  402. if (__first.__ctz_ != 0) {
  403. unsigned __clz = __bits_per_word - __first.__ctz_;
  404. difference_type __dn = std::min(static_cast<difference_type>(__clz), __n);
  405. __n -= __dn;
  406. __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
  407. __storage_type __b1 = *__first.__seg_ & __m;
  408. *__first.__seg_ &= ~__m;
  409. __storage_type __b2 = *__result.__seg_ & __m;
  410. *__result.__seg_ &= ~__m;
  411. *__result.__seg_ |= __b1;
  412. *__first.__seg_ |= __b2;
  413. __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
  414. __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
  415. ++__first.__seg_;
  416. // __first.__ctz_ = 0;
  417. }
  418. // __first.__ctz_ == 0;
  419. // do middle words
  420. for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
  421. swap(*__first.__seg_, *__result.__seg_);
  422. // do last word
  423. if (__n > 0) {
  424. __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
  425. __storage_type __b1 = *__first.__seg_ & __m;
  426. *__first.__seg_ &= ~__m;
  427. __storage_type __b2 = *__result.__seg_ & __m;
  428. *__result.__seg_ &= ~__m;
  429. *__result.__seg_ |= __b1;
  430. *__first.__seg_ |= __b2;
  431. __result.__ctz_ = static_cast<unsigned>(__n);
  432. }
  433. }
  434. return __result;
  435. }
  436. template <class _Cl, class _Cr>
  437. _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> __swap_ranges_unaligned(
  438. __bit_iterator<_Cl, false> __first, __bit_iterator<_Cl, false> __last, __bit_iterator<_Cr, false> __result) {
  439. using _I1 = __bit_iterator<_Cl, false>;
  440. using difference_type = typename _I1::difference_type;
  441. using __storage_type = typename _I1::__storage_type;
  442. const int __bits_per_word = _I1::__bits_per_word;
  443. difference_type __n = __last - __first;
  444. if (__n > 0) {
  445. // do first word
  446. if (__first.__ctz_ != 0) {
  447. unsigned __clz_f = __bits_per_word - __first.__ctz_;
  448. difference_type __dn = std::min(static_cast<difference_type>(__clz_f), __n);
  449. __n -= __dn;
  450. __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
  451. __storage_type __b1 = *__first.__seg_ & __m;
  452. *__first.__seg_ &= ~__m;
  453. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  454. __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r);
  455. __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
  456. __storage_type __b2 = *__result.__seg_ & __m;
  457. *__result.__seg_ &= ~__m;
  458. if (__result.__ctz_ > __first.__ctz_) {
  459. unsigned __s = __result.__ctz_ - __first.__ctz_;
  460. *__result.__seg_ |= __b1 << __s;
  461. *__first.__seg_ |= __b2 >> __s;
  462. } else {
  463. unsigned __s = __first.__ctz_ - __result.__ctz_;
  464. *__result.__seg_ |= __b1 >> __s;
  465. *__first.__seg_ |= __b2 << __s;
  466. }
  467. __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
  468. __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
  469. __dn -= __ddn;
  470. if (__dn > 0) {
  471. __m = ~__storage_type(0) >> (__bits_per_word - __dn);
  472. __b2 = *__result.__seg_ & __m;
  473. *__result.__seg_ &= ~__m;
  474. unsigned __s = __first.__ctz_ + __ddn;
  475. *__result.__seg_ |= __b1 >> __s;
  476. *__first.__seg_ |= __b2 << __s;
  477. __result.__ctz_ = static_cast<unsigned>(__dn);
  478. }
  479. ++__first.__seg_;
  480. // __first.__ctz_ = 0;
  481. }
  482. // __first.__ctz_ == 0;
  483. // do middle words
  484. __storage_type __m = ~__storage_type(0) << __result.__ctz_;
  485. unsigned __clz_r = __bits_per_word - __result.__ctz_;
  486. for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) {
  487. __storage_type __b1 = *__first.__seg_;
  488. __storage_type __b2 = *__result.__seg_ & __m;
  489. *__result.__seg_ &= ~__m;
  490. *__result.__seg_ |= __b1 << __result.__ctz_;
  491. *__first.__seg_ = __b2 >> __result.__ctz_;
  492. ++__result.__seg_;
  493. __b2 = *__result.__seg_ & ~__m;
  494. *__result.__seg_ &= __m;
  495. *__result.__seg_ |= __b1 >> __clz_r;
  496. *__first.__seg_ |= __b2 << __clz_r;
  497. }
  498. // do last word
  499. if (__n > 0) {
  500. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  501. __storage_type __b1 = *__first.__seg_ & __m;
  502. *__first.__seg_ &= ~__m;
  503. __storage_type __dn = std::min<__storage_type>(__n, __clz_r);
  504. __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
  505. __storage_type __b2 = *__result.__seg_ & __m;
  506. *__result.__seg_ &= ~__m;
  507. *__result.__seg_ |= __b1 << __result.__ctz_;
  508. *__first.__seg_ |= __b2 >> __result.__ctz_;
  509. __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
  510. __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
  511. __n -= __dn;
  512. if (__n > 0) {
  513. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  514. __b2 = *__result.__seg_ & __m;
  515. *__result.__seg_ &= ~__m;
  516. *__result.__seg_ |= __b1 >> __dn;
  517. *__first.__seg_ |= __b2 << __dn;
  518. __result.__ctz_ = static_cast<unsigned>(__n);
  519. }
  520. }
  521. }
  522. return __result;
  523. }
  524. template <class _Cl, class _Cr>
  525. inline _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> swap_ranges(
  526. __bit_iterator<_Cl, false> __first1, __bit_iterator<_Cl, false> __last1, __bit_iterator<_Cr, false> __first2) {
  527. if (__first1.__ctz_ == __first2.__ctz_)
  528. return std::__swap_ranges_aligned(__first1, __last1, __first2);
  529. return std::__swap_ranges_unaligned(__first1, __last1, __first2);
  530. }
  531. // rotate
  532. template <class _Cp>
  533. struct __bit_array {
  534. using difference_type = typename _Cp::difference_type;
  535. using __storage_type = typename _Cp::__storage_type;
  536. using __storage_pointer = typename _Cp::__storage_pointer;
  537. using iterator = typename _Cp::iterator;
  538. static const unsigned __bits_per_word = _Cp::__bits_per_word;
  539. static const unsigned _Np = 4;
  540. difference_type __size_;
  541. __storage_type __word_[_Np];
  542. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static difference_type capacity() {
  543. return static_cast<difference_type>(_Np * __bits_per_word);
  544. }
  545. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit __bit_array(difference_type __s) : __size_(__s) {
  546. if (__libcpp_is_constant_evaluated()) {
  547. for (size_t __i = 0; __i != __bit_array<_Cp>::_Np; ++__i)
  548. std::__construct_at(__word_ + __i, 0);
  549. }
  550. }
  551. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator begin() {
  552. return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
  553. }
  554. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator end() {
  555. return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
  556. static_cast<unsigned>(__size_ % __bits_per_word));
  557. }
  558. };
  559. template <class _Cp>
  560. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false>
  561. rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last) {
  562. using _I1 = __bit_iterator<_Cp, false>;
  563. using difference_type = typename _I1::difference_type;
  564. difference_type __d1 = __middle - __first;
  565. difference_type __d2 = __last - __middle;
  566. _I1 __r = __first + __d2;
  567. while (__d1 != 0 && __d2 != 0) {
  568. if (__d1 <= __d2) {
  569. if (__d1 <= __bit_array<_Cp>::capacity()) {
  570. __bit_array<_Cp> __b(__d1);
  571. std::copy(__first, __middle, __b.begin());
  572. std::copy(__b.begin(), __b.end(), std::copy(__middle, __last, __first));
  573. break;
  574. } else {
  575. __bit_iterator<_Cp, false> __mp = std::swap_ranges(__first, __middle, __middle);
  576. __first = __middle;
  577. __middle = __mp;
  578. __d2 -= __d1;
  579. }
  580. } else {
  581. if (__d2 <= __bit_array<_Cp>::capacity()) {
  582. __bit_array<_Cp> __b(__d2);
  583. std::copy(__middle, __last, __b.begin());
  584. std::copy_backward(__b.begin(), __b.end(), std::copy_backward(__first, __middle, __last));
  585. break;
  586. } else {
  587. __bit_iterator<_Cp, false> __mp = __first + __d2;
  588. std::swap_ranges(__first, __mp, __middle);
  589. __first = __mp;
  590. __d1 -= __d2;
  591. }
  592. }
  593. }
  594. return __r;
  595. }
  596. // equal
  597. template <class _Cp, bool _IC1, bool _IC2>
  598. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __equal_unaligned(
  599. __bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) {
  600. using _It = __bit_iterator<_Cp, _IC1>;
  601. using difference_type = typename _It::difference_type;
  602. using __storage_type = typename _It::__storage_type;
  603. const int __bits_per_word = _It::__bits_per_word;
  604. difference_type __n = __last1 - __first1;
  605. if (__n > 0) {
  606. // do first word
  607. if (__first1.__ctz_ != 0) {
  608. unsigned __clz_f = __bits_per_word - __first1.__ctz_;
  609. difference_type __dn = std::min(static_cast<difference_type>(__clz_f), __n);
  610. __n -= __dn;
  611. __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
  612. __storage_type __b = *__first1.__seg_ & __m;
  613. unsigned __clz_r = __bits_per_word - __first2.__ctz_;
  614. __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r);
  615. __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
  616. if (__first2.__ctz_ > __first1.__ctz_) {
  617. if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
  618. return false;
  619. } else {
  620. if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
  621. return false;
  622. }
  623. __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
  624. __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_) % __bits_per_word);
  625. __dn -= __ddn;
  626. if (__dn > 0) {
  627. __m = ~__storage_type(0) >> (__bits_per_word - __dn);
  628. if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
  629. return false;
  630. __first2.__ctz_ = static_cast<unsigned>(__dn);
  631. }
  632. ++__first1.__seg_;
  633. // __first1.__ctz_ = 0;
  634. }
  635. // __first1.__ctz_ == 0;
  636. // do middle words
  637. unsigned __clz_r = __bits_per_word - __first2.__ctz_;
  638. __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
  639. for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_) {
  640. __storage_type __b = *__first1.__seg_;
  641. if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
  642. return false;
  643. ++__first2.__seg_;
  644. if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
  645. return false;
  646. }
  647. // do last word
  648. if (__n > 0) {
  649. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  650. __storage_type __b = *__first1.__seg_ & __m;
  651. __storage_type __dn = std::min(__n, static_cast<difference_type>(__clz_r));
  652. __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
  653. if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
  654. return false;
  655. __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
  656. __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_) % __bits_per_word);
  657. __n -= __dn;
  658. if (__n > 0) {
  659. __m = ~__storage_type(0) >> (__bits_per_word - __n);
  660. if ((*__first2.__seg_ & __m) != (__b >> __dn))
  661. return false;
  662. }
  663. }
  664. }
  665. return true;
  666. }
  667. template <class _Cp, bool _IC1, bool _IC2>
  668. _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __equal_aligned(
  669. __bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) {
  670. using _It = __bit_iterator<_Cp, _IC1>;
  671. using difference_type = typename _It::difference_type;
  672. using __storage_type = typename _It::__storage_type;
  673. const int __bits_per_word = _It::__bits_per_word;
  674. difference_type __n = __last1 - __first1;
  675. if (__n > 0) {
  676. // do first word
  677. if (__first1.__ctz_ != 0) {
  678. unsigned __clz = __bits_per_word - __first1.__ctz_;
  679. difference_type __dn = std::min(static_cast<difference_type>(__clz), __n);
  680. __n -= __dn;
  681. __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
  682. if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
  683. return false;
  684. ++__first2.__seg_;
  685. ++__first1.__seg_;
  686. // __first1.__ctz_ = 0;
  687. // __first2.__ctz_ = 0;
  688. }
  689. // __first1.__ctz_ == 0;
  690. // __first2.__ctz_ == 0;
  691. // do middle words
  692. for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
  693. if (*__first2.__seg_ != *__first1.__seg_)
  694. return false;
  695. // do last word
  696. if (__n > 0) {
  697. __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
  698. if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
  699. return false;
  700. }
  701. }
  702. return true;
  703. }
  704. template <class _Cp, bool _IC1, bool _IC2>
  705. inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
  706. equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) {
  707. if (__first1.__ctz_ == __first2.__ctz_)
  708. return std::__equal_aligned(__first1, __last1, __first2);
  709. return std::__equal_unaligned(__first1, __last1, __first2);
  710. }
  711. template <class _Cp, bool _IsConst, typename _Cp::__storage_type>
  712. class __bit_iterator {
  713. public:
  714. using difference_type = typename _Cp::difference_type;
  715. using value_type = bool;
  716. using pointer = __bit_iterator;
  717. #ifndef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL
  718. using reference = __conditional_t<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >;
  719. #else
  720. using reference = __conditional_t<_IsConst, bool, __bit_reference<_Cp> >;
  721. #endif
  722. using iterator_category = random_access_iterator_tag;
  723. private:
  724. using __storage_type = typename _Cp::__storage_type;
  725. using __storage_pointer =
  726. __conditional_t<_IsConst, typename _Cp::__const_storage_pointer, typename _Cp::__storage_pointer>;
  727. static const unsigned __bits_per_word = _Cp::__bits_per_word;
  728. __storage_pointer __seg_;
  729. unsigned __ctz_;
  730. public:
  731. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator() _NOEXCEPT
  732. #if _LIBCPP_STD_VER >= 14
  733. : __seg_(nullptr),
  734. __ctz_(0)
  735. #endif
  736. {
  737. }
  738. // When _IsConst=false, this is the copy constructor.
  739. // It is non-trivial. Making it trivial would break ABI.
  740. // When _IsConst=true, this is a converting constructor;
  741. // the copy and move constructors are implicitly generated
  742. // and trivial.
  743. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT
  744. : __seg_(__it.__seg_),
  745. __ctz_(__it.__ctz_) {}
  746. // When _IsConst=false, we have a user-provided copy constructor,
  747. // so we must also provide a copy assignment operator because
  748. // the implicit generation of a defaulted one is deprecated.
  749. // When _IsConst=true, the assignment operators are
  750. // implicitly generated and trivial.
  751. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator&
  752. operator=(const _If<_IsConst, struct __private_nat, __bit_iterator>& __it) {
  753. __seg_ = __it.__seg_;
  754. __ctz_ = __it.__ctz_;
  755. return *this;
  756. }
  757. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator*() const _NOEXCEPT {
  758. return __conditional_t<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >(
  759. __seg_, __storage_type(1) << __ctz_);
  760. }
  761. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator++() {
  762. if (__ctz_ != __bits_per_word - 1)
  763. ++__ctz_;
  764. else {
  765. __ctz_ = 0;
  766. ++__seg_;
  767. }
  768. return *this;
  769. }
  770. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator++(int) {
  771. __bit_iterator __tmp = *this;
  772. ++(*this);
  773. return __tmp;
  774. }
  775. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator--() {
  776. if (__ctz_ != 0)
  777. --__ctz_;
  778. else {
  779. __ctz_ = __bits_per_word - 1;
  780. --__seg_;
  781. }
  782. return *this;
  783. }
  784. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator--(int) {
  785. __bit_iterator __tmp = *this;
  786. --(*this);
  787. return __tmp;
  788. }
  789. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator+=(difference_type __n) {
  790. if (__n >= 0)
  791. __seg_ += (__n + __ctz_) / __bits_per_word;
  792. else
  793. __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1) /
  794. static_cast<difference_type>(__bits_per_word);
  795. __n &= (__bits_per_word - 1);
  796. __ctz_ = static_cast<unsigned>((__n + __ctz_) % __bits_per_word);
  797. return *this;
  798. }
  799. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator-=(difference_type __n) {
  800. return *this += -__n;
  801. }
  802. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator+(difference_type __n) const {
  803. __bit_iterator __t(*this);
  804. __t += __n;
  805. return __t;
  806. }
  807. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator-(difference_type __n) const {
  808. __bit_iterator __t(*this);
  809. __t -= __n;
  810. return __t;
  811. }
  812. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator
  813. operator+(difference_type __n, const __bit_iterator& __it) {
  814. return __it + __n;
  815. }
  816. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend difference_type
  817. operator-(const __bit_iterator& __x, const __bit_iterator& __y) {
  818. return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;
  819. }
  820. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](difference_type __n) const {
  821. return *(*this + __n);
  822. }
  823. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  824. operator==(const __bit_iterator& __x, const __bit_iterator& __y) {
  825. return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;
  826. }
  827. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  828. operator!=(const __bit_iterator& __x, const __bit_iterator& __y) {
  829. return !(__x == __y);
  830. }
  831. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  832. operator<(const __bit_iterator& __x, const __bit_iterator& __y) {
  833. return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);
  834. }
  835. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  836. operator>(const __bit_iterator& __x, const __bit_iterator& __y) {
  837. return __y < __x;
  838. }
  839. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  840. operator<=(const __bit_iterator& __x, const __bit_iterator& __y) {
  841. return !(__y < __x);
  842. }
  843. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  844. operator>=(const __bit_iterator& __x, const __bit_iterator& __y) {
  845. return !(__x < __y);
  846. }
  847. private:
  848. _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit __bit_iterator(
  849. __storage_pointer __s, unsigned __ctz) _NOEXCEPT
  850. : __seg_(__s),
  851. __ctz_(__ctz) {}
  852. friend typename _Cp::__self;
  853. friend class __bit_reference<_Cp>;
  854. friend class __bit_const_reference<_Cp>;
  855. friend class __bit_iterator<_Cp, true>;
  856. template <class _Dp>
  857. friend struct __bit_array;
  858. template <bool _FillVal, class _Dp>
  859. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend void
  860. __fill_n_bool(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
  861. template <class _Dp, bool _IC>
  862. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false> __copy_aligned(
  863. __bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  864. template <class _Dp, bool _IC>
  865. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false> __copy_unaligned(
  866. __bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  867. template <class _Dp, bool _IC>
  868. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false>
  869. copy(__bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  870. template <class _Dp, bool _IC>
  871. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false> __copy_backward_aligned(
  872. __bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  873. template <class _Dp, bool _IC>
  874. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false> __copy_backward_unaligned(
  875. __bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  876. template <class _Dp, bool _IC>
  877. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false>
  878. copy_backward(__bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
  879. template <class _Cl, class _Cr>
  880. friend __bit_iterator<_Cr, false>
  881. __swap_ranges_aligned(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>);
  882. template <class _Cl, class _Cr>
  883. friend __bit_iterator<_Cr, false>
  884. __swap_ranges_unaligned(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>);
  885. template <class _Cl, class _Cr>
  886. friend __bit_iterator<_Cr, false>
  887. swap_ranges(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>);
  888. template <class _Dp>
  889. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false>
  890. rotate(__bit_iterator<_Dp, false>, __bit_iterator<_Dp, false>, __bit_iterator<_Dp, false>);
  891. template <class _Dp, bool _IC1, bool _IC2>
  892. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  893. __equal_aligned(__bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC2>);
  894. template <class _Dp, bool _IC1, bool _IC2>
  895. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  896. __equal_unaligned(__bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC2>);
  897. template <class _Dp, bool _IC1, bool _IC2>
  898. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool
  899. equal(__bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC1>, __bit_iterator<_Dp, _IC2>);
  900. template <bool _ToFind, class _Dp, bool _IC>
  901. _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, _IC>
  902. __find_bool(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
  903. template <bool _ToCount, class _Dp, bool _IC>
  904. friend typename __bit_iterator<_Dp, _IC>::difference_type _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
  905. __count_bool(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
  906. };
  907. _LIBCPP_END_NAMESPACE_STD
  908. _LIBCPP_POP_MACROS
  909. #endif // _LIBCPP___BIT_REFERENCE