__bit_reference 52 KB

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