__bit_reference 51 KB

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