is_heap_until.hpp 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. //
  12. // Copyright 2005 - 2007 Adobe Systems Incorporated
  13. // Distributed under the MIT License(see accompanying file LICENSE_1_0_0.txt
  14. // or a copy at http://stlab.adobe.com/licenses.html)
  15. //===----------------------------------------------------------------------===//
  16. //
  17. // The LLVM Compiler Infrastructure
  18. //
  19. // This file is dual licensed under the MIT and the University of Illinois Open
  20. // Source Licenses. See LICENSE.TXT for details.
  21. //
  22. //===----------------------------------------------------------------------===//
  23. // Implementation based on the code in libc++
  24. // http://http://libcxx.llvm.org/
  25. #include <vector>
  26. #include <range/v3/core.hpp>
  27. #include <range/v3/algorithm/heap_algorithm.hpp>
  28. #include "../array.hpp"
  29. #include "../simple_test.hpp"
  30. #include "../test_utils.hpp"
  31. #include "../test_iterators.hpp"
  32. void test_basic()
  33. {
  34. #ifdef IS_HEAP_UNTIL_1
  35. auto is_heap_until = make_testable_1(ranges::is_heap_until);
  36. int i1[] = {0, 0};
  37. is_heap_until(i1, i1).check([&](int*r){CHECK(r == i1);});
  38. is_heap_until(i1, i1).check([&](int *r){ CHECK(r == i1); });
  39. is_heap_until(i1, i1+1).check([&](int *r){ CHECK(r == i1+1); });
  40. int i2[] = {0, 1};
  41. int i3[] = {1, 0};
  42. is_heap_until(i1, i1+2).check([&](int *r){ CHECK(r == i1+2); });
  43. is_heap_until(i2, i2+2).check([&](int *r){ CHECK(r == i2+1); });
  44. is_heap_until(i3, i3+2).check([&](int *r){ CHECK(r == i3+2); });
  45. int i4[] = {0, 0, 0};
  46. int i5[] = {0, 0, 1};
  47. int i6[] = {0, 1, 0};
  48. int i7[] = {0, 1, 1};
  49. int i8[] = {1, 0, 0};
  50. int i9[] = {1, 0, 1};
  51. int i10[] = {1, 1, 0};
  52. is_heap_until(i4, i4+3).check([&](int *r){ CHECK(r == i4+3); });
  53. is_heap_until(i5, i5+3).check([&](int *r){ CHECK(r == i5+2); });
  54. is_heap_until(i6, i6+3).check([&](int *r){ CHECK(r == i6+1); });
  55. is_heap_until(i7, i7+3).check([&](int *r){ CHECK(r == i7+1); });
  56. is_heap_until(i8, i8+3).check([&](int *r){ CHECK(r == i8+3); });
  57. is_heap_until(i9, i9+3).check([&](int *r){ CHECK(r == i9+3); });
  58. is_heap_until(i10, i10+3).check([&](int *r){ CHECK(r == i10+3); });
  59. int i11[] = {0, 0, 0, 0};
  60. int i12[] = {0, 0, 0, 1};
  61. int i13[] = {0, 0, 1, 0};
  62. int i14[] = {0, 0, 1, 1};
  63. int i15[] = {0, 1, 0, 0};
  64. int i16[] = {0, 1, 0, 1};
  65. int i17[] = {0, 1, 1, 0};
  66. int i18[] = {0, 1, 1, 1};
  67. int i19[] = {1, 0, 0, 0};
  68. int i20[] = {1, 0, 0, 1};
  69. int i21[] = {1, 0, 1, 0};
  70. int i22[] = {1, 0, 1, 1};
  71. int i23[] = {1, 1, 0, 0};
  72. int i24[] = {1, 1, 0, 1};
  73. int i25[] = {1, 1, 1, 0};
  74. is_heap_until(i11, i11+4).check([&](int *r){ CHECK(r == i11+4); });
  75. is_heap_until(i12, i12+4).check([&](int *r){ CHECK(r == i12+3); });
  76. is_heap_until(i13, i13+4).check([&](int *r){ CHECK(r == i13+2); });
  77. is_heap_until(i14, i14+4).check([&](int *r){ CHECK(r == i14+2); });
  78. is_heap_until(i15, i15+4).check([&](int *r){ CHECK(r == i15+1); });
  79. is_heap_until(i16, i16+4).check([&](int *r){ CHECK(r == i16+1); });
  80. is_heap_until(i17, i17+4).check([&](int *r){ CHECK(r == i17+1); });
  81. is_heap_until(i18, i18+4).check([&](int *r){ CHECK(r == i18+1); });
  82. is_heap_until(i19, i19+4).check([&](int *r){ CHECK(r == i19+4); });
  83. is_heap_until(i20, i20+4).check([&](int *r){ CHECK(r == i20+3); });
  84. is_heap_until(i21, i21+4).check([&](int *r){ CHECK(r == i21+4); });
  85. is_heap_until(i22, i22+4).check([&](int *r){ CHECK(r == i22+3); });
  86. is_heap_until(i23, i23+4).check([&](int *r){ CHECK(r == i23+4); });
  87. is_heap_until(i24, i24+4).check([&](int *r){ CHECK(r == i24+4); });
  88. is_heap_until(i25, i25+4).check([&](int *r){ CHECK(r == i25+4); });
  89. int i26[] = {0, 0, 0, 0, 0};
  90. int i27[] = {0, 0, 0, 0, 1};
  91. int i28[] = {0, 0, 0, 1, 0};
  92. int i29[] = {0, 0, 0, 1, 1};
  93. int i30[] = {0, 0, 1, 0, 0};
  94. int i31[] = {0, 0, 1, 0, 1};
  95. int i32[] = {0, 0, 1, 1, 0};
  96. int i33[] = {0, 0, 1, 1, 1};
  97. int i34[] = {0, 1, 0, 0, 0};
  98. int i35[] = {0, 1, 0, 0, 1};
  99. int i36[] = {0, 1, 0, 1, 0};
  100. int i37[] = {0, 1, 0, 1, 1};
  101. int i38[] = {0, 1, 1, 0, 0};
  102. int i39[] = {0, 1, 1, 0, 1};
  103. int i40[] = {0, 1, 1, 1, 0};
  104. int i41[] = {0, 1, 1, 1, 1};
  105. int i42[] = {1, 0, 0, 0, 0};
  106. int i43[] = {1, 0, 0, 0, 1};
  107. int i44[] = {1, 0, 0, 1, 0};
  108. int i45[] = {1, 0, 0, 1, 1};
  109. int i46[] = {1, 0, 1, 0, 0};
  110. int i47[] = {1, 0, 1, 0, 1};
  111. int i48[] = {1, 0, 1, 1, 0};
  112. int i49[] = {1, 0, 1, 1, 1};
  113. int i50[] = {1, 1, 0, 0, 0};
  114. int i51[] = {1, 1, 0, 0, 1};
  115. int i52[] = {1, 1, 0, 1, 0};
  116. int i53[] = {1, 1, 0, 1, 1};
  117. int i54[] = {1, 1, 1, 0, 0};
  118. int i55[] = {1, 1, 1, 0, 1};
  119. int i56[] = {1, 1, 1, 1, 0};
  120. is_heap_until(i26, i26+5).check([&](int *r){ CHECK(r == i26+5); });
  121. is_heap_until(i27, i27+5).check([&](int *r){ CHECK(r == i27+4); });
  122. is_heap_until(i28, i28+5).check([&](int *r){ CHECK(r == i28+3); });
  123. is_heap_until(i29, i29+5).check([&](int *r){ CHECK(r == i29+3); });
  124. is_heap_until(i30, i30+5).check([&](int *r){ CHECK(r == i30+2); });
  125. is_heap_until(i31, i31+5).check([&](int *r){ CHECK(r == i31+2); });
  126. is_heap_until(i32, i32+5).check([&](int *r){ CHECK(r == i32+2); });
  127. is_heap_until(i33, i33+5).check([&](int *r){ CHECK(r == i33+2); });
  128. is_heap_until(i34, i34+5).check([&](int *r){ CHECK(r == i34+1); });
  129. is_heap_until(i35, i35+5).check([&](int *r){ CHECK(r == i35+1); });
  130. is_heap_until(i36, i36+5).check([&](int *r){ CHECK(r == i36+1); });
  131. is_heap_until(i37, i37+5).check([&](int *r){ CHECK(r == i37+1); });
  132. is_heap_until(i38, i38+5).check([&](int *r){ CHECK(r == i38+1); });
  133. is_heap_until(i39, i39+5).check([&](int *r){ CHECK(r == i39+1); });
  134. is_heap_until(i40, i40+5).check([&](int *r){ CHECK(r == i40+1); });
  135. is_heap_until(i41, i41+5).check([&](int *r){ CHECK(r == i41+1); });
  136. is_heap_until(i42, i42+5).check([&](int *r){ CHECK(r == i42+5); });
  137. is_heap_until(i43, i43+5).check([&](int *r){ CHECK(r == i43+4); });
  138. is_heap_until(i44, i44+5).check([&](int *r){ CHECK(r == i44+3); });
  139. is_heap_until(i45, i45+5).check([&](int *r){ CHECK(r == i45+3); });
  140. is_heap_until(i46, i46+5).check([&](int *r){ CHECK(r == i46+5); });
  141. is_heap_until(i47, i47+5).check([&](int *r){ CHECK(r == i47+4); });
  142. is_heap_until(i48, i48+5).check([&](int *r){ CHECK(r == i48+3); });
  143. is_heap_until(i49, i49+5).check([&](int *r){ CHECK(r == i49+3); });
  144. is_heap_until(i50, i50+5).check([&](int *r){ CHECK(r == i50+5); });
  145. is_heap_until(i51, i51+5).check([&](int *r){ CHECK(r == i51+5); });
  146. is_heap_until(i52, i52+5).check([&](int *r){ CHECK(r == i52+5); });
  147. is_heap_until(i53, i53+5).check([&](int *r){ CHECK(r == i53+5); });
  148. is_heap_until(i54, i54+5).check([&](int *r){ CHECK(r == i54+5); });
  149. is_heap_until(i55, i55+5).check([&](int *r){ CHECK(r == i55+5); });
  150. is_heap_until(i56, i56+5).check([&](int *r){ CHECK(r == i56+5); });
  151. int i57[] = {0, 0, 0, 0, 0, 0};
  152. int i58[] = {0, 0, 0, 0, 0, 1};
  153. int i59[] = {0, 0, 0, 0, 1, 0};
  154. int i60[] = {0, 0, 0, 0, 1, 1};
  155. int i61[] = {0, 0, 0, 1, 0, 0};
  156. int i62[] = {0, 0, 0, 1, 0, 1};
  157. int i63[] = {0, 0, 0, 1, 1, 0};
  158. int i64[] = {0, 0, 0, 1, 1, 1};
  159. int i65[] = {0, 0, 1, 0, 0, 0};
  160. int i66[] = {0, 0, 1, 0, 0, 1};
  161. int i67[] = {0, 0, 1, 0, 1, 0};
  162. int i68[] = {0, 0, 1, 0, 1, 1};
  163. int i69[] = {0, 0, 1, 1, 0, 0};
  164. int i70[] = {0, 0, 1, 1, 0, 1};
  165. int i71[] = {0, 0, 1, 1, 1, 0};
  166. int i72[] = {0, 0, 1, 1, 1, 1};
  167. int i73[] = {0, 1, 0, 0, 0, 0};
  168. int i74[] = {0, 1, 0, 0, 0, 1};
  169. int i75[] = {0, 1, 0, 0, 1, 0};
  170. int i76[] = {0, 1, 0, 0, 1, 1};
  171. int i77[] = {0, 1, 0, 1, 0, 0};
  172. int i78[] = {0, 1, 0, 1, 0, 1};
  173. int i79[] = {0, 1, 0, 1, 1, 0};
  174. int i80[] = {0, 1, 0, 1, 1, 1};
  175. int i81[] = {0, 1, 1, 0, 0, 0};
  176. int i82[] = {0, 1, 1, 0, 0, 1};
  177. int i83[] = {0, 1, 1, 0, 1, 0};
  178. int i84[] = {0, 1, 1, 0, 1, 1};
  179. int i85[] = {0, 1, 1, 1, 0, 0};
  180. int i86[] = {0, 1, 1, 1, 0, 1};
  181. int i87[] = {0, 1, 1, 1, 1, 0};
  182. int i88[] = {0, 1, 1, 1, 1, 1};
  183. int i89[] = {1, 0, 0, 0, 0, 0};
  184. int i90[] = {1, 0, 0, 0, 0, 1};
  185. int i91[] = {1, 0, 0, 0, 1, 0};
  186. int i92[] = {1, 0, 0, 0, 1, 1};
  187. int i93[] = {1, 0, 0, 1, 0, 0};
  188. int i94[] = {1, 0, 0, 1, 0, 1};
  189. int i95[] = {1, 0, 0, 1, 1, 0};
  190. int i96[] = {1, 0, 0, 1, 1, 1};
  191. int i97[] = {1, 0, 1, 0, 0, 0};
  192. int i98[] = {1, 0, 1, 0, 0, 1};
  193. int i99[] = {1, 0, 1, 0, 1, 0};
  194. int i100[] = {1, 0, 1, 0, 1, 1};
  195. int i101[] = {1, 0, 1, 1, 0, 0};
  196. int i102[] = {1, 0, 1, 1, 0, 1};
  197. int i103[] = {1, 0, 1, 1, 1, 0};
  198. int i104[] = {1, 0, 1, 1, 1, 1};
  199. int i105[] = {1, 1, 0, 0, 0, 0};
  200. int i106[] = {1, 1, 0, 0, 0, 1};
  201. int i107[] = {1, 1, 0, 0, 1, 0};
  202. int i108[] = {1, 1, 0, 0, 1, 1};
  203. int i109[] = {1, 1, 0, 1, 0, 0};
  204. int i110[] = {1, 1, 0, 1, 0, 1};
  205. int i111[] = {1, 1, 0, 1, 1, 0};
  206. int i112[] = {1, 1, 0, 1, 1, 1};
  207. int i113[] = {1, 1, 1, 0, 0, 0};
  208. int i114[] = {1, 1, 1, 0, 0, 1};
  209. int i115[] = {1, 1, 1, 0, 1, 0};
  210. int i116[] = {1, 1, 1, 0, 1, 1};
  211. int i117[] = {1, 1, 1, 1, 0, 0};
  212. int i118[] = {1, 1, 1, 1, 0, 1};
  213. int i119[] = {1, 1, 1, 1, 1, 0};
  214. is_heap_until(i57, i57+6).check([&](int *r){ CHECK(r == i57+6); });
  215. is_heap_until(i58, i58+6).check([&](int *r){ CHECK(r == i58+5); });
  216. is_heap_until(i59, i59+6).check([&](int *r){ CHECK(r == i59+4); });
  217. is_heap_until(i60, i60+6).check([&](int *r){ CHECK(r == i60+4); });
  218. is_heap_until(i61, i61+6).check([&](int *r){ CHECK(r == i61+3); });
  219. is_heap_until(i62, i62+6).check([&](int *r){ CHECK(r == i62+3); });
  220. is_heap_until(i63, i63+6).check([&](int *r){ CHECK(r == i63+3); });
  221. is_heap_until(i64, i64+6).check([&](int *r){ CHECK(r == i64+3); });
  222. is_heap_until(i65, i65+6).check([&](int *r){ CHECK(r == i65+2); });
  223. is_heap_until(i66, i66+6).check([&](int *r){ CHECK(r == i66+2); });
  224. is_heap_until(i67, i67+6).check([&](int *r){ CHECK(r == i67+2); });
  225. is_heap_until(i68, i68+6).check([&](int *r){ CHECK(r == i68+2); });
  226. is_heap_until(i69, i69+6).check([&](int *r){ CHECK(r == i69+2); });
  227. is_heap_until(i70, i70+6).check([&](int *r){ CHECK(r == i70+2); });
  228. is_heap_until(i71, i71+6).check([&](int *r){ CHECK(r == i71+2); });
  229. is_heap_until(i72, i72+6).check([&](int *r){ CHECK(r == i72+2); });
  230. is_heap_until(i73, i73+6).check([&](int *r){ CHECK(r == i73+1); });
  231. is_heap_until(i74, i74+6).check([&](int *r){ CHECK(r == i74+1); });
  232. is_heap_until(i75, i75+6).check([&](int *r){ CHECK(r == i75+1); });
  233. is_heap_until(i76, i76+6).check([&](int *r){ CHECK(r == i76+1); });
  234. is_heap_until(i77, i77+6).check([&](int *r){ CHECK(r == i77+1); });
  235. is_heap_until(i78, i78+6).check([&](int *r){ CHECK(r == i78+1); });
  236. is_heap_until(i79, i79+6).check([&](int *r){ CHECK(r == i79+1); });
  237. is_heap_until(i80, i80+6).check([&](int *r){ CHECK(r == i80+1); });
  238. is_heap_until(i81, i81+6).check([&](int *r){ CHECK(r == i81+1); });
  239. is_heap_until(i82, i82+6).check([&](int *r){ CHECK(r == i82+1); });
  240. is_heap_until(i83, i83+6).check([&](int *r){ CHECK(r == i83+1); });
  241. is_heap_until(i84, i84+6).check([&](int *r){ CHECK(r == i84+1); });
  242. is_heap_until(i85, i85+6).check([&](int *r){ CHECK(r == i85+1); });
  243. is_heap_until(i86, i86+6).check([&](int *r){ CHECK(r == i86+1); });
  244. is_heap_until(i87, i87+6).check([&](int *r){ CHECK(r == i87+1); });
  245. is_heap_until(i88, i88+6).check([&](int *r){ CHECK(r == i88+1); });
  246. is_heap_until(i89, i89+6).check([&](int *r){ CHECK(r == i89+6); });
  247. is_heap_until(i90, i90+6).check([&](int *r){ CHECK(r == i90+5); });
  248. is_heap_until(i91, i91+6).check([&](int *r){ CHECK(r == i91+4); });
  249. is_heap_until(i92, i92+6).check([&](int *r){ CHECK(r == i92+4); });
  250. is_heap_until(i93, i93+6).check([&](int *r){ CHECK(r == i93+3); });
  251. is_heap_until(i94, i94+6).check([&](int *r){ CHECK(r == i94+3); });
  252. is_heap_until(i95, i95+6).check([&](int *r){ CHECK(r == i95+3); });
  253. is_heap_until(i96, i96+6).check([&](int *r){ CHECK(r == i96+3); });
  254. is_heap_until(i97, i97+6).check([&](int *r){ CHECK(r == i97+6); });
  255. is_heap_until(i98, i98+6).check([&](int *r){ CHECK(r == i98+6); });
  256. is_heap_until(i99, i99+6).check([&](int *r){ CHECK(r == i99+4); });
  257. is_heap_until(i100, i100+6).check([&](int *r){ CHECK(r == i100+4); });
  258. is_heap_until(i101, i101+6).check([&](int *r){ CHECK(r == i101+3); });
  259. is_heap_until(i102, i102+6).check([&](int *r){ CHECK(r == i102+3); });
  260. is_heap_until(i103, i103+6).check([&](int *r){ CHECK(r == i103+3); });
  261. is_heap_until(i104, i104+6).check([&](int *r){ CHECK(r == i104+3); });
  262. is_heap_until(i105, i105+6).check([&](int *r){ CHECK(r == i105+6); });
  263. is_heap_until(i106, i106+6).check([&](int *r){ CHECK(r == i106+5); });
  264. is_heap_until(i107, i107+6).check([&](int *r){ CHECK(r == i107+6); });
  265. is_heap_until(i108, i108+6).check([&](int *r){ CHECK(r == i108+5); });
  266. is_heap_until(i109, i109+6).check([&](int *r){ CHECK(r == i109+6); });
  267. is_heap_until(i110, i110+6).check([&](int *r){ CHECK(r == i110+5); });
  268. is_heap_until(i111, i111+6).check([&](int *r){ CHECK(r == i111+6); });
  269. is_heap_until(i112, i112+6).check([&](int *r){ CHECK(r == i112+5); });
  270. is_heap_until(i113, i113+6).check([&](int *r){ CHECK(r == i113+6); });
  271. is_heap_until(i114, i114+6).check([&](int *r){ CHECK(r == i114+6); });
  272. is_heap_until(i115, i115+6).check([&](int *r){ CHECK(r == i115+6); });
  273. is_heap_until(i116, i116+6).check([&](int *r){ CHECK(r == i116+6); });
  274. is_heap_until(i117, i117+6).check([&](int *r){ CHECK(r == i117+6); });
  275. is_heap_until(i118, i118+6).check([&](int *r){ CHECK(r == i118+6); });
  276. is_heap_until(i119, i119+6).check([&](int *r){ CHECK(r == i119+6); });
  277. #endif
  278. #ifdef IS_HEAP_UNTIL_2
  279. auto is_heap_until = make_testable_1(ranges::is_heap_until);
  280. int i120[] = {0, 0, 0, 0, 0, 0, 0};
  281. int i121[] = {0, 0, 0, 0, 0, 0, 1};
  282. int i122[] = {0, 0, 0, 0, 0, 1, 0};
  283. int i123[] = {0, 0, 0, 0, 0, 1, 1};
  284. int i124[] = {0, 0, 0, 0, 1, 0, 0};
  285. int i125[] = {0, 0, 0, 0, 1, 0, 1};
  286. int i126[] = {0, 0, 0, 0, 1, 1, 0};
  287. int i127[] = {0, 0, 0, 0, 1, 1, 1};
  288. int i128[] = {0, 0, 0, 1, 0, 0, 0};
  289. int i129[] = {0, 0, 0, 1, 0, 0, 1};
  290. int i130[] = {0, 0, 0, 1, 0, 1, 0};
  291. int i131[] = {0, 0, 0, 1, 0, 1, 1};
  292. int i132[] = {0, 0, 0, 1, 1, 0, 0};
  293. int i133[] = {0, 0, 0, 1, 1, 0, 1};
  294. int i134[] = {0, 0, 0, 1, 1, 1, 0};
  295. int i135[] = {0, 0, 0, 1, 1, 1, 1};
  296. int i136[] = {0, 0, 1, 0, 0, 0, 0};
  297. int i137[] = {0, 0, 1, 0, 0, 0, 1};
  298. int i138[] = {0, 0, 1, 0, 0, 1, 0};
  299. int i139[] = {0, 0, 1, 0, 0, 1, 1};
  300. int i140[] = {0, 0, 1, 0, 1, 0, 0};
  301. int i141[] = {0, 0, 1, 0, 1, 0, 1};
  302. int i142[] = {0, 0, 1, 0, 1, 1, 0};
  303. int i143[] = {0, 0, 1, 0, 1, 1, 1};
  304. int i144[] = {0, 0, 1, 1, 0, 0, 0};
  305. int i145[] = {0, 0, 1, 1, 0, 0, 1};
  306. int i146[] = {0, 0, 1, 1, 0, 1, 0};
  307. int i147[] = {0, 0, 1, 1, 0, 1, 1};
  308. int i148[] = {0, 0, 1, 1, 1, 0, 0};
  309. int i149[] = {0, 0, 1, 1, 1, 0, 1};
  310. int i150[] = {0, 0, 1, 1, 1, 1, 0};
  311. int i151[] = {0, 0, 1, 1, 1, 1, 1};
  312. int i152[] = {0, 1, 0, 0, 0, 0, 0};
  313. int i153[] = {0, 1, 0, 0, 0, 0, 1};
  314. int i154[] = {0, 1, 0, 0, 0, 1, 0};
  315. int i155[] = {0, 1, 0, 0, 0, 1, 1};
  316. int i156[] = {0, 1, 0, 0, 1, 0, 0};
  317. int i157[] = {0, 1, 0, 0, 1, 0, 1};
  318. int i158[] = {0, 1, 0, 0, 1, 1, 0};
  319. int i159[] = {0, 1, 0, 0, 1, 1, 1};
  320. int i160[] = {0, 1, 0, 1, 0, 0, 0};
  321. int i161[] = {0, 1, 0, 1, 0, 0, 1};
  322. int i162[] = {0, 1, 0, 1, 0, 1, 0};
  323. int i163[] = {0, 1, 0, 1, 0, 1, 1};
  324. int i164[] = {0, 1, 0, 1, 1, 0, 0};
  325. int i165[] = {0, 1, 0, 1, 1, 0, 1};
  326. int i166[] = {0, 1, 0, 1, 1, 1, 0};
  327. int i167[] = {0, 1, 0, 1, 1, 1, 1};
  328. int i168[] = {0, 1, 1, 0, 0, 0, 0};
  329. int i169[] = {0, 1, 1, 0, 0, 0, 1};
  330. int i170[] = {0, 1, 1, 0, 0, 1, 0};
  331. int i171[] = {0, 1, 1, 0, 0, 1, 1};
  332. int i172[] = {0, 1, 1, 0, 1, 0, 0};
  333. int i173[] = {0, 1, 1, 0, 1, 0, 1};
  334. int i174[] = {0, 1, 1, 0, 1, 1, 0};
  335. int i175[] = {0, 1, 1, 0, 1, 1, 1};
  336. int i176[] = {0, 1, 1, 1, 0, 0, 0};
  337. int i177[] = {0, 1, 1, 1, 0, 0, 1};
  338. int i178[] = {0, 1, 1, 1, 0, 1, 0};
  339. int i179[] = {0, 1, 1, 1, 0, 1, 1};
  340. int i180[] = {0, 1, 1, 1, 1, 0, 0};
  341. int i181[] = {0, 1, 1, 1, 1, 0, 1};
  342. int i182[] = {0, 1, 1, 1, 1, 1, 0};
  343. int i183[] = {0, 1, 1, 1, 1, 1, 1};
  344. int i184[] = {1, 0, 0, 0, 0, 0, 0};
  345. int i185[] = {1, 0, 0, 0, 0, 0, 1};
  346. int i186[] = {1, 0, 0, 0, 0, 1, 0};
  347. int i187[] = {1, 0, 0, 0, 0, 1, 1};
  348. int i188[] = {1, 0, 0, 0, 1, 0, 0};
  349. int i189[] = {1, 0, 0, 0, 1, 0, 1};
  350. int i190[] = {1, 0, 0, 0, 1, 1, 0};
  351. int i191[] = {1, 0, 0, 0, 1, 1, 1};
  352. int i192[] = {1, 0, 0, 1, 0, 0, 0};
  353. int i193[] = {1, 0, 0, 1, 0, 0, 1};
  354. int i194[] = {1, 0, 0, 1, 0, 1, 0};
  355. int i195[] = {1, 0, 0, 1, 0, 1, 1};
  356. int i196[] = {1, 0, 0, 1, 1, 0, 0};
  357. int i197[] = {1, 0, 0, 1, 1, 0, 1};
  358. int i198[] = {1, 0, 0, 1, 1, 1, 0};
  359. int i199[] = {1, 0, 0, 1, 1, 1, 1};
  360. int i200[] = {1, 0, 1, 0, 0, 0, 0};
  361. int i201[] = {1, 0, 1, 0, 0, 0, 1};
  362. int i202[] = {1, 0, 1, 0, 0, 1, 0};
  363. int i203[] = {1, 0, 1, 0, 0, 1, 1};
  364. int i204[] = {1, 0, 1, 0, 1, 0, 0};
  365. int i205[] = {1, 0, 1, 0, 1, 0, 1};
  366. int i206[] = {1, 0, 1, 0, 1, 1, 0};
  367. int i207[] = {1, 0, 1, 0, 1, 1, 1};
  368. int i208[] = {1, 0, 1, 1, 0, 0, 0};
  369. int i209[] = {1, 0, 1, 1, 0, 0, 1};
  370. int i210[] = {1, 0, 1, 1, 0, 1, 0};
  371. int i211[] = {1, 0, 1, 1, 0, 1, 1};
  372. int i212[] = {1, 0, 1, 1, 1, 0, 0};
  373. int i213[] = {1, 0, 1, 1, 1, 0, 1};
  374. int i214[] = {1, 0, 1, 1, 1, 1, 0};
  375. int i215[] = {1, 0, 1, 1, 1, 1, 1};
  376. int i216[] = {1, 1, 0, 0, 0, 0, 0};
  377. int i217[] = {1, 1, 0, 0, 0, 0, 1};
  378. int i218[] = {1, 1, 0, 0, 0, 1, 0};
  379. int i219[] = {1, 1, 0, 0, 0, 1, 1};
  380. int i220[] = {1, 1, 0, 0, 1, 0, 0};
  381. int i221[] = {1, 1, 0, 0, 1, 0, 1};
  382. int i222[] = {1, 1, 0, 0, 1, 1, 0};
  383. int i223[] = {1, 1, 0, 0, 1, 1, 1};
  384. int i224[] = {1, 1, 0, 1, 0, 0, 0};
  385. int i225[] = {1, 1, 0, 1, 0, 0, 1};
  386. int i226[] = {1, 1, 0, 1, 0, 1, 0};
  387. int i227[] = {1, 1, 0, 1, 0, 1, 1};
  388. int i228[] = {1, 1, 0, 1, 1, 0, 0};
  389. int i229[] = {1, 1, 0, 1, 1, 0, 1};
  390. int i230[] = {1, 1, 0, 1, 1, 1, 0};
  391. int i231[] = {1, 1, 0, 1, 1, 1, 1};
  392. int i232[] = {1, 1, 1, 0, 0, 0, 0};
  393. int i233[] = {1, 1, 1, 0, 0, 0, 1};
  394. int i234[] = {1, 1, 1, 0, 0, 1, 0};
  395. int i235[] = {1, 1, 1, 0, 0, 1, 1};
  396. int i236[] = {1, 1, 1, 0, 1, 0, 0};
  397. int i237[] = {1, 1, 1, 0, 1, 0, 1};
  398. int i238[] = {1, 1, 1, 0, 1, 1, 0};
  399. int i239[] = {1, 1, 1, 0, 1, 1, 1};
  400. int i240[] = {1, 1, 1, 1, 0, 0, 0};
  401. int i241[] = {1, 1, 1, 1, 0, 0, 1};
  402. int i242[] = {1, 1, 1, 1, 0, 1, 0};
  403. int i243[] = {1, 1, 1, 1, 0, 1, 1};
  404. int i244[] = {1, 1, 1, 1, 1, 0, 0};
  405. int i245[] = {1, 1, 1, 1, 1, 0, 1};
  406. int i246[] = {1, 1, 1, 1, 1, 1, 0};
  407. is_heap_until(i120, i120+7).check([&](int *r){ CHECK(r == i120+7); });
  408. is_heap_until(i121, i121+7).check([&](int *r){ CHECK(r == i121+6); });
  409. is_heap_until(i122, i122+7).check([&](int *r){ CHECK(r == i122+5); });
  410. is_heap_until(i123, i123+7).check([&](int *r){ CHECK(r == i123+5); });
  411. is_heap_until(i124, i124+7).check([&](int *r){ CHECK(r == i124+4); });
  412. is_heap_until(i125, i125+7).check([&](int *r){ CHECK(r == i125+4); });
  413. is_heap_until(i126, i126+7).check([&](int *r){ CHECK(r == i126+4); });
  414. is_heap_until(i127, i127+7).check([&](int *r){ CHECK(r == i127+4); });
  415. is_heap_until(i128, i128+7).check([&](int *r){ CHECK(r == i128+3); });
  416. is_heap_until(i129, i129+7).check([&](int *r){ CHECK(r == i129+3); });
  417. is_heap_until(i130, i130+7).check([&](int *r){ CHECK(r == i130+3); });
  418. is_heap_until(i131, i131+7).check([&](int *r){ CHECK(r == i131+3); });
  419. is_heap_until(i132, i132+7).check([&](int *r){ CHECK(r == i132+3); });
  420. is_heap_until(i133, i133+7).check([&](int *r){ CHECK(r == i133+3); });
  421. is_heap_until(i134, i134+7).check([&](int *r){ CHECK(r == i134+3); });
  422. is_heap_until(i135, i135+7).check([&](int *r){ CHECK(r == i135+3); });
  423. is_heap_until(i136, i136+7).check([&](int *r){ CHECK(r == i136+2); });
  424. is_heap_until(i137, i137+7).check([&](int *r){ CHECK(r == i137+2); });
  425. is_heap_until(i138, i138+7).check([&](int *r){ CHECK(r == i138+2); });
  426. is_heap_until(i139, i139+7).check([&](int *r){ CHECK(r == i139+2); });
  427. is_heap_until(i140, i140+7).check([&](int *r){ CHECK(r == i140+2); });
  428. is_heap_until(i141, i141+7).check([&](int *r){ CHECK(r == i141+2); });
  429. is_heap_until(i142, i142+7).check([&](int *r){ CHECK(r == i142+2); });
  430. is_heap_until(i143, i143+7).check([&](int *r){ CHECK(r == i143+2); });
  431. is_heap_until(i144, i144+7).check([&](int *r){ CHECK(r == i144+2); });
  432. is_heap_until(i145, i145+7).check([&](int *r){ CHECK(r == i145+2); });
  433. is_heap_until(i146, i146+7).check([&](int *r){ CHECK(r == i146+2); });
  434. is_heap_until(i147, i147+7).check([&](int *r){ CHECK(r == i147+2); });
  435. is_heap_until(i148, i148+7).check([&](int *r){ CHECK(r == i148+2); });
  436. is_heap_until(i149, i149+7).check([&](int *r){ CHECK(r == i149+2); });
  437. is_heap_until(i150, i150+7).check([&](int *r){ CHECK(r == i150+2); });
  438. is_heap_until(i151, i151+7).check([&](int *r){ CHECK(r == i151+2); });
  439. is_heap_until(i152, i152+7).check([&](int *r){ CHECK(r == i152+1); });
  440. is_heap_until(i153, i153+7).check([&](int *r){ CHECK(r == i153+1); });
  441. is_heap_until(i154, i154+7).check([&](int *r){ CHECK(r == i154+1); });
  442. is_heap_until(i155, i155+7).check([&](int *r){ CHECK(r == i155+1); });
  443. is_heap_until(i156, i156+7).check([&](int *r){ CHECK(r == i156+1); });
  444. is_heap_until(i157, i157+7).check([&](int *r){ CHECK(r == i157+1); });
  445. is_heap_until(i158, i158+7).check([&](int *r){ CHECK(r == i158+1); });
  446. is_heap_until(i159, i159+7).check([&](int *r){ CHECK(r == i159+1); });
  447. is_heap_until(i160, i160+7).check([&](int *r){ CHECK(r == i160+1); });
  448. is_heap_until(i161, i161+7).check([&](int *r){ CHECK(r == i161+1); });
  449. is_heap_until(i162, i162+7).check([&](int *r){ CHECK(r == i162+1); });
  450. is_heap_until(i163, i163+7).check([&](int *r){ CHECK(r == i163+1); });
  451. is_heap_until(i164, i164+7).check([&](int *r){ CHECK(r == i164+1); });
  452. is_heap_until(i165, i165+7).check([&](int *r){ CHECK(r == i165+1); });
  453. is_heap_until(i166, i166+7).check([&](int *r){ CHECK(r == i166+1); });
  454. is_heap_until(i167, i167+7).check([&](int *r){ CHECK(r == i167+1); });
  455. is_heap_until(i168, i168+7).check([&](int *r){ CHECK(r == i168+1); });
  456. is_heap_until(i169, i169+7).check([&](int *r){ CHECK(r == i169+1); });
  457. is_heap_until(i170, i170+7).check([&](int *r){ CHECK(r == i170+1); });
  458. is_heap_until(i171, i171+7).check([&](int *r){ CHECK(r == i171+1); });
  459. is_heap_until(i172, i172+7).check([&](int *r){ CHECK(r == i172+1); });
  460. is_heap_until(i173, i173+7).check([&](int *r){ CHECK(r == i173+1); });
  461. is_heap_until(i174, i174+7).check([&](int *r){ CHECK(r == i174+1); });
  462. is_heap_until(i175, i175+7).check([&](int *r){ CHECK(r == i175+1); });
  463. is_heap_until(i176, i176+7).check([&](int *r){ CHECK(r == i176+1); });
  464. is_heap_until(i177, i177+7).check([&](int *r){ CHECK(r == i177+1); });
  465. is_heap_until(i178, i178+7).check([&](int *r){ CHECK(r == i178+1); });
  466. is_heap_until(i179, i179+7).check([&](int *r){ CHECK(r == i179+1); });
  467. is_heap_until(i180, i180+7).check([&](int *r){ CHECK(r == i180+1); });
  468. is_heap_until(i181, i181+7).check([&](int *r){ CHECK(r == i181+1); });
  469. is_heap_until(i182, i182+7).check([&](int *r){ CHECK(r == i182+1); });
  470. is_heap_until(i183, i183+7).check([&](int *r){ CHECK(r == i183+1); });
  471. is_heap_until(i184, i184+7).check([&](int *r){ CHECK(r == i184+7); });
  472. is_heap_until(i185, i185+7).check([&](int *r){ CHECK(r == i185+6); });
  473. is_heap_until(i186, i186+7).check([&](int *r){ CHECK(r == i186+5); });
  474. is_heap_until(i187, i187+7).check([&](int *r){ CHECK(r == i187+5); });
  475. is_heap_until(i188, i188+7).check([&](int *r){ CHECK(r == i188+4); });
  476. is_heap_until(i189, i189+7).check([&](int *r){ CHECK(r == i189+4); });
  477. is_heap_until(i190, i190+7).check([&](int *r){ CHECK(r == i190+4); });
  478. is_heap_until(i191, i191+7).check([&](int *r){ CHECK(r == i191+4); });
  479. is_heap_until(i192, i192+7).check([&](int *r){ CHECK(r == i192+3); });
  480. is_heap_until(i193, i193+7).check([&](int *r){ CHECK(r == i193+3); });
  481. is_heap_until(i194, i194+7).check([&](int *r){ CHECK(r == i194+3); });
  482. is_heap_until(i195, i195+7).check([&](int *r){ CHECK(r == i195+3); });
  483. is_heap_until(i196, i196+7).check([&](int *r){ CHECK(r == i196+3); });
  484. is_heap_until(i197, i197+7).check([&](int *r){ CHECK(r == i197+3); });
  485. is_heap_until(i198, i198+7).check([&](int *r){ CHECK(r == i198+3); });
  486. is_heap_until(i199, i199+7).check([&](int *r){ CHECK(r == i199+3); });
  487. is_heap_until(i200, i200+7).check([&](int *r){ CHECK(r == i200+7); });
  488. is_heap_until(i201, i201+7).check([&](int *r){ CHECK(r == i201+7); });
  489. is_heap_until(i202, i202+7).check([&](int *r){ CHECK(r == i202+7); });
  490. is_heap_until(i203, i203+7).check([&](int *r){ CHECK(r == i203+7); });
  491. is_heap_until(i204, i204+7).check([&](int *r){ CHECK(r == i204+4); });
  492. is_heap_until(i205, i205+7).check([&](int *r){ CHECK(r == i205+4); });
  493. is_heap_until(i206, i206+7).check([&](int *r){ CHECK(r == i206+4); });
  494. is_heap_until(i207, i207+7).check([&](int *r){ CHECK(r == i207+4); });
  495. is_heap_until(i208, i208+7).check([&](int *r){ CHECK(r == i208+3); });
  496. is_heap_until(i209, i209+7).check([&](int *r){ CHECK(r == i209+3); });
  497. is_heap_until(i210, i210+7).check([&](int *r){ CHECK(r == i210+3); });
  498. is_heap_until(i211, i211+7).check([&](int *r){ CHECK(r == i211+3); });
  499. is_heap_until(i212, i212+7).check([&](int *r){ CHECK(r == i212+3); });
  500. is_heap_until(i213, i213+7).check([&](int *r){ CHECK(r == i213+3); });
  501. is_heap_until(i214, i214+7).check([&](int *r){ CHECK(r == i214+3); });
  502. is_heap_until(i215, i215+7).check([&](int *r){ CHECK(r == i215+3); });
  503. is_heap_until(i216, i216+7).check([&](int *r){ CHECK(r == i216+7); });
  504. is_heap_until(i217, i217+7).check([&](int *r){ CHECK(r == i217+6); });
  505. is_heap_until(i218, i218+7).check([&](int *r){ CHECK(r == i218+5); });
  506. is_heap_until(i219, i219+7).check([&](int *r){ CHECK(r == i219+5); });
  507. is_heap_until(i220, i220+7).check([&](int *r){ CHECK(r == i220+7); });
  508. is_heap_until(i221, i221+7).check([&](int *r){ CHECK(r == i221+6); });
  509. is_heap_until(i222, i222+7).check([&](int *r){ CHECK(r == i222+5); });
  510. is_heap_until(i223, i223+7).check([&](int *r){ CHECK(r == i223+5); });
  511. is_heap_until(i224, i224+7).check([&](int *r){ CHECK(r == i224+7); });
  512. is_heap_until(i225, i225+7).check([&](int *r){ CHECK(r == i225+6); });
  513. is_heap_until(i226, i226+7).check([&](int *r){ CHECK(r == i226+5); });
  514. is_heap_until(i227, i227+7).check([&](int *r){ CHECK(r == i227+5); });
  515. is_heap_until(i228, i228+7).check([&](int *r){ CHECK(r == i228+7); });
  516. is_heap_until(i229, i229+7).check([&](int *r){ CHECK(r == i229+6); });
  517. is_heap_until(i230, i230+7).check([&](int *r){ CHECK(r == i230+5); });
  518. is_heap_until(i231, i231+7).check([&](int *r){ CHECK(r == i231+5); });
  519. is_heap_until(i232, i232+7).check([&](int *r){ CHECK(r == i232+7); });
  520. is_heap_until(i233, i233+7).check([&](int *r){ CHECK(r == i233+7); });
  521. is_heap_until(i234, i234+7).check([&](int *r){ CHECK(r == i234+7); });
  522. is_heap_until(i235, i235+7).check([&](int *r){ CHECK(r == i235+7); });
  523. is_heap_until(i236, i236+7).check([&](int *r){ CHECK(r == i236+7); });
  524. is_heap_until(i237, i237+7).check([&](int *r){ CHECK(r == i237+7); });
  525. is_heap_until(i238, i238+7).check([&](int *r){ CHECK(r == i238+7); });
  526. is_heap_until(i239, i239+7).check([&](int *r){ CHECK(r == i239+7); });
  527. is_heap_until(i240, i240+7).check([&](int *r){ CHECK(r == i240+7); });
  528. is_heap_until(i241, i241+7).check([&](int *r){ CHECK(r == i241+7); });
  529. is_heap_until(i242, i242+7).check([&](int *r){ CHECK(r == i242+7); });
  530. is_heap_until(i243, i243+7).check([&](int *r){ CHECK(r == i243+7); });
  531. is_heap_until(i244, i244+7).check([&](int *r){ CHECK(r == i244+7); });
  532. is_heap_until(i245, i245+7).check([&](int *r){ CHECK(r == i245+7); });
  533. is_heap_until(i246, i246+7).check([&](int *r){ CHECK(r == i246+7); });
  534. #endif
  535. }
  536. void test_pred()
  537. {
  538. #ifdef IS_HEAP_UNTIL_3
  539. auto is_heap_until = ::make_testable_1(ranges::is_heap_until);
  540. int i1[] = {0, 0};
  541. is_heap_until(i1, i1, std::greater<int>()).check([&](int *r){ CHECK(r == i1); });
  542. is_heap_until(i1, i1+1, std::greater<int>()).check([&](int *r){ CHECK(r == i1+1); });
  543. int i2[] = {0, 1};
  544. int i3[] = {1, 0};
  545. is_heap_until(i1, i1+2, std::greater<int>()).check([&](int *r){ CHECK(r == i1+2); });
  546. is_heap_until(i2, i2+2, std::greater<int>()).check([&](int *r){ CHECK(r == i2+2); });
  547. is_heap_until(i3, i3+2, std::greater<int>()).check([&](int *r){ CHECK(r == i3+1); });
  548. int i4[] = {0, 0, 0};
  549. int i5[] = {0, 0, 1};
  550. int i6[] = {0, 1, 0};
  551. int i7[] = {0, 1, 1};
  552. int i8[] = {1, 0, 0};
  553. int i9[] = {1, 0, 1};
  554. int i10[] = {1, 1, 0};
  555. is_heap_until(i4, i4+3, std::greater<int>()).check([&](int *r){ CHECK(r == i4+3); });
  556. is_heap_until(i5, i5+3, std::greater<int>()).check([&](int *r){ CHECK(r == i5+3); });
  557. is_heap_until(i6, i6+3, std::greater<int>()).check([&](int *r){ CHECK(r == i6+3); });
  558. is_heap_until(i7, i7+3, std::greater<int>()).check([&](int *r){ CHECK(r == i7+3); });
  559. is_heap_until(i8, i8+3, std::greater<int>()).check([&](int *r){ CHECK(r == i8+1); });
  560. is_heap_until(i9, i9+3, std::greater<int>()).check([&](int *r){ CHECK(r == i9+1); });
  561. is_heap_until(i10, i10+3, std::greater<int>()).check([&](int *r){ CHECK(r == i10+2); });
  562. int i11[] = {0, 0, 0, 0};
  563. int i12[] = {0, 0, 0, 1};
  564. int i13[] = {0, 0, 1, 0};
  565. int i14[] = {0, 0, 1, 1};
  566. int i15[] = {0, 1, 0, 0};
  567. int i16[] = {0, 1, 0, 1};
  568. int i17[] = {0, 1, 1, 0};
  569. int i18[] = {0, 1, 1, 1};
  570. int i19[] = {1, 0, 0, 0};
  571. int i20[] = {1, 0, 0, 1};
  572. int i21[] = {1, 0, 1, 0};
  573. int i22[] = {1, 0, 1, 1};
  574. int i23[] = {1, 1, 0, 0};
  575. int i24[] = {1, 1, 0, 1};
  576. int i25[] = {1, 1, 1, 0};
  577. is_heap_until(i11, i11+4, std::greater<int>()).check([&](int *r){ CHECK(r == i11+4); });
  578. is_heap_until(i12, i12+4, std::greater<int>()).check([&](int *r){ CHECK(r == i12+4); });
  579. is_heap_until(i13, i13+4, std::greater<int>()).check([&](int *r){ CHECK(r == i13+4); });
  580. is_heap_until(i14, i14+4, std::greater<int>()).check([&](int *r){ CHECK(r == i14+4); });
  581. is_heap_until(i15, i15+4, std::greater<int>()).check([&](int *r){ CHECK(r == i15+3); });
  582. is_heap_until(i16, i16+4, std::greater<int>()).check([&](int *r){ CHECK(r == i16+4); });
  583. is_heap_until(i17, i17+4, std::greater<int>()).check([&](int *r){ CHECK(r == i17+3); });
  584. is_heap_until(i18, i18+4, std::greater<int>()).check([&](int *r){ CHECK(r == i18+4); });
  585. is_heap_until(i19, i19+4, std::greater<int>()).check([&](int *r){ CHECK(r == i19+1); });
  586. is_heap_until(i20, i20+4, std::greater<int>()).check([&](int *r){ CHECK(r == i20+1); });
  587. is_heap_until(i21, i21+4, std::greater<int>()).check([&](int *r){ CHECK(r == i21+1); });
  588. is_heap_until(i22, i22+4, std::greater<int>()).check([&](int *r){ CHECK(r == i22+1); });
  589. is_heap_until(i23, i23+4, std::greater<int>()).check([&](int *r){ CHECK(r == i23+2); });
  590. is_heap_until(i24, i24+4, std::greater<int>()).check([&](int *r){ CHECK(r == i24+2); });
  591. is_heap_until(i25, i25+4, std::greater<int>()).check([&](int *r){ CHECK(r == i25+3); });
  592. int i26[] = {0, 0, 0, 0, 0};
  593. int i27[] = {0, 0, 0, 0, 1};
  594. int i28[] = {0, 0, 0, 1, 0};
  595. int i29[] = {0, 0, 0, 1, 1};
  596. int i30[] = {0, 0, 1, 0, 0};
  597. int i31[] = {0, 0, 1, 0, 1};
  598. int i32[] = {0, 0, 1, 1, 0};
  599. int i33[] = {0, 0, 1, 1, 1};
  600. int i34[] = {0, 1, 0, 0, 0};
  601. int i35[] = {0, 1, 0, 0, 1};
  602. int i36[] = {0, 1, 0, 1, 0};
  603. int i37[] = {0, 1, 0, 1, 1};
  604. int i38[] = {0, 1, 1, 0, 0};
  605. int i39[] = {0, 1, 1, 0, 1};
  606. int i40[] = {0, 1, 1, 1, 0};
  607. int i41[] = {0, 1, 1, 1, 1};
  608. int i42[] = {1, 0, 0, 0, 0};
  609. int i43[] = {1, 0, 0, 0, 1};
  610. int i44[] = {1, 0, 0, 1, 0};
  611. int i45[] = {1, 0, 0, 1, 1};
  612. int i46[] = {1, 0, 1, 0, 0};
  613. int i47[] = {1, 0, 1, 0, 1};
  614. int i48[] = {1, 0, 1, 1, 0};
  615. int i49[] = {1, 0, 1, 1, 1};
  616. int i50[] = {1, 1, 0, 0, 0};
  617. int i51[] = {1, 1, 0, 0, 1};
  618. int i52[] = {1, 1, 0, 1, 0};
  619. int i53[] = {1, 1, 0, 1, 1};
  620. int i54[] = {1, 1, 1, 0, 0};
  621. int i55[] = {1, 1, 1, 0, 1};
  622. int i56[] = {1, 1, 1, 1, 0};
  623. is_heap_until(i26, i26+5, std::greater<int>()).check([&](int *r){ CHECK(r == i26+5); });
  624. is_heap_until(i27, i27+5, std::greater<int>()).check([&](int *r){ CHECK(r == i27+5); });
  625. is_heap_until(i28, i28+5, std::greater<int>()).check([&](int *r){ CHECK(r == i28+5); });
  626. is_heap_until(i29, i29+5, std::greater<int>()).check([&](int *r){ CHECK(r == i29+5); });
  627. is_heap_until(i30, i30+5, std::greater<int>()).check([&](int *r){ CHECK(r == i30+5); });
  628. is_heap_until(i31, i31+5, std::greater<int>()).check([&](int *r){ CHECK(r == i31+5); });
  629. is_heap_until(i32, i32+5, std::greater<int>()).check([&](int *r){ CHECK(r == i32+5); });
  630. is_heap_until(i33, i33+5, std::greater<int>()).check([&](int *r){ CHECK(r == i33+5); });
  631. is_heap_until(i34, i34+5, std::greater<int>()).check([&](int *r){ CHECK(r == i34+3); });
  632. is_heap_until(i35, i35+5, std::greater<int>()).check([&](int *r){ CHECK(r == i35+3); });
  633. is_heap_until(i36, i36+5, std::greater<int>()).check([&](int *r){ CHECK(r == i36+4); });
  634. is_heap_until(i37, i37+5, std::greater<int>()).check([&](int *r){ CHECK(r == i37+5); });
  635. is_heap_until(i38, i38+5, std::greater<int>()).check([&](int *r){ CHECK(r == i38+3); });
  636. is_heap_until(i39, i39+5, std::greater<int>()).check([&](int *r){ CHECK(r == i39+3); });
  637. is_heap_until(i40, i40+5, std::greater<int>()).check([&](int *r){ CHECK(r == i40+4); });
  638. is_heap_until(i41, i41+5, std::greater<int>()).check([&](int *r){ CHECK(r == i41+5); });
  639. is_heap_until(i42, i42+5, std::greater<int>()).check([&](int *r){ CHECK(r == i42+1); });
  640. is_heap_until(i43, i43+5, std::greater<int>()).check([&](int *r){ CHECK(r == i43+1); });
  641. is_heap_until(i44, i44+5, std::greater<int>()).check([&](int *r){ CHECK(r == i44+1); });
  642. is_heap_until(i45, i45+5, std::greater<int>()).check([&](int *r){ CHECK(r == i45+1); });
  643. is_heap_until(i46, i46+5, std::greater<int>()).check([&](int *r){ CHECK(r == i46+1); });
  644. is_heap_until(i47, i47+5, std::greater<int>()).check([&](int *r){ CHECK(r == i47+1); });
  645. is_heap_until(i48, i48+5, std::greater<int>()).check([&](int *r){ CHECK(r == i48+1); });
  646. is_heap_until(i49, i49+5, std::greater<int>()).check([&](int *r){ CHECK(r == i49+1); });
  647. is_heap_until(i50, i50+5, std::greater<int>()).check([&](int *r){ CHECK(r == i50+2); });
  648. is_heap_until(i51, i51+5, std::greater<int>()).check([&](int *r){ CHECK(r == i51+2); });
  649. is_heap_until(i52, i52+5, std::greater<int>()).check([&](int *r){ CHECK(r == i52+2); });
  650. is_heap_until(i53, i53+5, std::greater<int>()).check([&](int *r){ CHECK(r == i53+2); });
  651. is_heap_until(i54, i54+5, std::greater<int>()).check([&](int *r){ CHECK(r == i54+3); });
  652. is_heap_until(i55, i55+5, std::greater<int>()).check([&](int *r){ CHECK(r == i55+3); });
  653. is_heap_until(i56, i56+5, std::greater<int>()).check([&](int *r){ CHECK(r == i56+4); });
  654. int i57[] = {0, 0, 0, 0, 0, 0};
  655. int i58[] = {0, 0, 0, 0, 0, 1};
  656. int i59[] = {0, 0, 0, 0, 1, 0};
  657. int i60[] = {0, 0, 0, 0, 1, 1};
  658. int i61[] = {0, 0, 0, 1, 0, 0};
  659. int i62[] = {0, 0, 0, 1, 0, 1};
  660. int i63[] = {0, 0, 0, 1, 1, 0};
  661. int i64[] = {0, 0, 0, 1, 1, 1};
  662. int i65[] = {0, 0, 1, 0, 0, 0};
  663. int i66[] = {0, 0, 1, 0, 0, 1};
  664. int i67[] = {0, 0, 1, 0, 1, 0};
  665. int i68[] = {0, 0, 1, 0, 1, 1};
  666. int i69[] = {0, 0, 1, 1, 0, 0};
  667. int i70[] = {0, 0, 1, 1, 0, 1};
  668. int i71[] = {0, 0, 1, 1, 1, 0};
  669. int i72[] = {0, 0, 1, 1, 1, 1};
  670. int i73[] = {0, 1, 0, 0, 0, 0};
  671. int i74[] = {0, 1, 0, 0, 0, 1};
  672. int i75[] = {0, 1, 0, 0, 1, 0};
  673. int i76[] = {0, 1, 0, 0, 1, 1};
  674. int i77[] = {0, 1, 0, 1, 0, 0};
  675. int i78[] = {0, 1, 0, 1, 0, 1};
  676. int i79[] = {0, 1, 0, 1, 1, 0};
  677. int i80[] = {0, 1, 0, 1, 1, 1};
  678. int i81[] = {0, 1, 1, 0, 0, 0};
  679. int i82[] = {0, 1, 1, 0, 0, 1};
  680. int i83[] = {0, 1, 1, 0, 1, 0};
  681. int i84[] = {0, 1, 1, 0, 1, 1};
  682. int i85[] = {0, 1, 1, 1, 0, 0};
  683. int i86[] = {0, 1, 1, 1, 0, 1};
  684. int i87[] = {0, 1, 1, 1, 1, 0};
  685. int i88[] = {0, 1, 1, 1, 1, 1};
  686. int i89[] = {1, 0, 0, 0, 0, 0};
  687. int i90[] = {1, 0, 0, 0, 0, 1};
  688. int i91[] = {1, 0, 0, 0, 1, 0};
  689. int i92[] = {1, 0, 0, 0, 1, 1};
  690. int i93[] = {1, 0, 0, 1, 0, 0};
  691. int i94[] = {1, 0, 0, 1, 0, 1};
  692. int i95[] = {1, 0, 0, 1, 1, 0};
  693. int i96[] = {1, 0, 0, 1, 1, 1};
  694. int i97[] = {1, 0, 1, 0, 0, 0};
  695. int i98[] = {1, 0, 1, 0, 0, 1};
  696. int i99[] = {1, 0, 1, 0, 1, 0};
  697. int i100[] = {1, 0, 1, 0, 1, 1};
  698. int i101[] = {1, 0, 1, 1, 0, 0};
  699. int i102[] = {1, 0, 1, 1, 0, 1};
  700. int i103[] = {1, 0, 1, 1, 1, 0};
  701. int i104[] = {1, 0, 1, 1, 1, 1};
  702. int i105[] = {1, 1, 0, 0, 0, 0};
  703. int i106[] = {1, 1, 0, 0, 0, 1};
  704. int i107[] = {1, 1, 0, 0, 1, 0};
  705. int i108[] = {1, 1, 0, 0, 1, 1};
  706. int i109[] = {1, 1, 0, 1, 0, 0};
  707. int i110[] = {1, 1, 0, 1, 0, 1};
  708. int i111[] = {1, 1, 0, 1, 1, 0};
  709. int i112[] = {1, 1, 0, 1, 1, 1};
  710. int i113[] = {1, 1, 1, 0, 0, 0};
  711. int i114[] = {1, 1, 1, 0, 0, 1};
  712. int i115[] = {1, 1, 1, 0, 1, 0};
  713. int i116[] = {1, 1, 1, 0, 1, 1};
  714. int i117[] = {1, 1, 1, 1, 0, 0};
  715. int i118[] = {1, 1, 1, 1, 0, 1};
  716. int i119[] = {1, 1, 1, 1, 1, 0};
  717. is_heap_until(i57, i57+6, std::greater<int>()).check([&](int *r){ CHECK(r == i57+6); });
  718. is_heap_until(i58, i58+6, std::greater<int>()).check([&](int *r){ CHECK(r == i58+6); });
  719. is_heap_until(i59, i59+6, std::greater<int>()).check([&](int *r){ CHECK(r == i59+6); });
  720. is_heap_until(i60, i60+6, std::greater<int>()).check([&](int *r){ CHECK(r == i60+6); });
  721. is_heap_until(i61, i61+6, std::greater<int>()).check([&](int *r){ CHECK(r == i61+6); });
  722. is_heap_until(i62, i62+6, std::greater<int>()).check([&](int *r){ CHECK(r == i62+6); });
  723. is_heap_until(i63, i63+6, std::greater<int>()).check([&](int *r){ CHECK(r == i63+6); });
  724. is_heap_until(i64, i64+6, std::greater<int>()).check([&](int *r){ CHECK(r == i64+6); });
  725. is_heap_until(i65, i65+6, std::greater<int>()).check([&](int *r){ CHECK(r == i65+5); });
  726. is_heap_until(i66, i66+6, std::greater<int>()).check([&](int *r){ CHECK(r == i66+6); });
  727. is_heap_until(i67, i67+6, std::greater<int>()).check([&](int *r){ CHECK(r == i67+5); });
  728. is_heap_until(i68, i68+6, std::greater<int>()).check([&](int *r){ CHECK(r == i68+6); });
  729. is_heap_until(i69, i69+6, std::greater<int>()).check([&](int *r){ CHECK(r == i69+5); });
  730. is_heap_until(i70, i70+6, std::greater<int>()).check([&](int *r){ CHECK(r == i70+6); });
  731. is_heap_until(i71, i71+6, std::greater<int>()).check([&](int *r){ CHECK(r == i71+5); });
  732. is_heap_until(i72, i72+6, std::greater<int>()).check([&](int *r){ CHECK(r == i72+6); });
  733. is_heap_until(i73, i73+6, std::greater<int>()).check([&](int *r){ CHECK(r == i73+3); });
  734. is_heap_until(i74, i74+6, std::greater<int>()).check([&](int *r){ CHECK(r == i74+3); });
  735. is_heap_until(i75, i75+6, std::greater<int>()).check([&](int *r){ CHECK(r == i75+3); });
  736. is_heap_until(i76, i76+6, std::greater<int>()).check([&](int *r){ CHECK(r == i76+3); });
  737. is_heap_until(i77, i77+6, std::greater<int>()).check([&](int *r){ CHECK(r == i77+4); });
  738. is_heap_until(i78, i78+6, std::greater<int>()).check([&](int *r){ CHECK(r == i78+4); });
  739. is_heap_until(i79, i79+6, std::greater<int>()).check([&](int *r){ CHECK(r == i79+6); });
  740. is_heap_until(i80, i80+6, std::greater<int>()).check([&](int *r){ CHECK(r == i80+6); });
  741. is_heap_until(i81, i81+6, std::greater<int>()).check([&](int *r){ CHECK(r == i81+3); });
  742. is_heap_until(i82, i82+6, std::greater<int>()).check([&](int *r){ CHECK(r == i82+3); });
  743. is_heap_until(i83, i83+6, std::greater<int>()).check([&](int *r){ CHECK(r == i83+3); });
  744. is_heap_until(i84, i84+6, std::greater<int>()).check([&](int *r){ CHECK(r == i84+3); });
  745. is_heap_until(i85, i85+6, std::greater<int>()).check([&](int *r){ CHECK(r == i85+4); });
  746. is_heap_until(i86, i86+6, std::greater<int>()).check([&](int *r){ CHECK(r == i86+4); });
  747. is_heap_until(i87, i87+6, std::greater<int>()).check([&](int *r){ CHECK(r == i87+5); });
  748. is_heap_until(i88, i88+6, std::greater<int>()).check([&](int *r){ CHECK(r == i88+6); });
  749. is_heap_until(i89, i89+6, std::greater<int>()).check([&](int *r){ CHECK(r == i89+1); });
  750. is_heap_until(i90, i90+6, std::greater<int>()).check([&](int *r){ CHECK(r == i90+1); });
  751. is_heap_until(i91, i91+6, std::greater<int>()).check([&](int *r){ CHECK(r == i91+1); });
  752. is_heap_until(i92, i92+6, std::greater<int>()).check([&](int *r){ CHECK(r == i92+1); });
  753. is_heap_until(i93, i93+6, std::greater<int>()).check([&](int *r){ CHECK(r == i93+1); });
  754. is_heap_until(i94, i94+6, std::greater<int>()).check([&](int *r){ CHECK(r == i94+1); });
  755. is_heap_until(i95, i95+6, std::greater<int>()).check([&](int *r){ CHECK(r == i95+1); });
  756. is_heap_until(i96, i96+6, std::greater<int>()).check([&](int *r){ CHECK(r == i96+1); });
  757. is_heap_until(i97, i97+6, std::greater<int>()).check([&](int *r){ CHECK(r == i97+1); });
  758. is_heap_until(i98, i98+6, std::greater<int>()).check([&](int *r){ CHECK(r == i98+1); });
  759. is_heap_until(i99, i99+6, std::greater<int>()).check([&](int *r){ CHECK(r == i99+1); });
  760. is_heap_until(i100, i100+6, std::greater<int>()).check([&](int *r){ CHECK(r == i100+1); });
  761. is_heap_until(i101, i101+6, std::greater<int>()).check([&](int *r){ CHECK(r == i101+1); });
  762. is_heap_until(i102, i102+6, std::greater<int>()).check([&](int *r){ CHECK(r == i102+1); });
  763. is_heap_until(i103, i103+6, std::greater<int>()).check([&](int *r){ CHECK(r == i103+1); });
  764. is_heap_until(i104, i104+6, std::greater<int>()).check([&](int *r){ CHECK(r == i104+1); });
  765. is_heap_until(i105, i105+6, std::greater<int>()).check([&](int *r){ CHECK(r == i105+2); });
  766. is_heap_until(i106, i106+6, std::greater<int>()).check([&](int *r){ CHECK(r == i106+2); });
  767. is_heap_until(i107, i107+6, std::greater<int>()).check([&](int *r){ CHECK(r == i107+2); });
  768. is_heap_until(i108, i108+6, std::greater<int>()).check([&](int *r){ CHECK(r == i108+2); });
  769. is_heap_until(i109, i109+6, std::greater<int>()).check([&](int *r){ CHECK(r == i109+2); });
  770. is_heap_until(i110, i110+6, std::greater<int>()).check([&](int *r){ CHECK(r == i110+2); });
  771. is_heap_until(i111, i111+6, std::greater<int>()).check([&](int *r){ CHECK(r == i111+2); });
  772. is_heap_until(i112, i112+6, std::greater<int>()).check([&](int *r){ CHECK(r == i112+2); });
  773. is_heap_until(i113, i113+6, std::greater<int>()).check([&](int *r){ CHECK(r == i113+3); });
  774. is_heap_until(i114, i114+6, std::greater<int>()).check([&](int *r){ CHECK(r == i114+3); });
  775. is_heap_until(i115, i115+6, std::greater<int>()).check([&](int *r){ CHECK(r == i115+3); });
  776. is_heap_until(i116, i116+6, std::greater<int>()).check([&](int *r){ CHECK(r == i116+3); });
  777. is_heap_until(i117, i117+6, std::greater<int>()).check([&](int *r){ CHECK(r == i117+4); });
  778. is_heap_until(i118, i118+6, std::greater<int>()).check([&](int *r){ CHECK(r == i118+4); });
  779. is_heap_until(i119, i119+6, std::greater<int>()).check([&](int *r){ CHECK(r == i119+5); });
  780. #endif
  781. #ifdef IS_HEAP_UNTIL_4
  782. auto is_heap_until = ::make_testable_1(ranges::is_heap_until);
  783. int i120[] = {0, 0, 0, 0, 0, 0, 0};
  784. int i121[] = {0, 0, 0, 0, 0, 0, 1};
  785. int i122[] = {0, 0, 0, 0, 0, 1, 0};
  786. int i123[] = {0, 0, 0, 0, 0, 1, 1};
  787. int i124[] = {0, 0, 0, 0, 1, 0, 0};
  788. int i125[] = {0, 0, 0, 0, 1, 0, 1};
  789. int i126[] = {0, 0, 0, 0, 1, 1, 0};
  790. int i127[] = {0, 0, 0, 0, 1, 1, 1};
  791. int i128[] = {0, 0, 0, 1, 0, 0, 0};
  792. int i129[] = {0, 0, 0, 1, 0, 0, 1};
  793. int i130[] = {0, 0, 0, 1, 0, 1, 0};
  794. int i131[] = {0, 0, 0, 1, 0, 1, 1};
  795. int i132[] = {0, 0, 0, 1, 1, 0, 0};
  796. int i133[] = {0, 0, 0, 1, 1, 0, 1};
  797. int i134[] = {0, 0, 0, 1, 1, 1, 0};
  798. int i135[] = {0, 0, 0, 1, 1, 1, 1};
  799. int i136[] = {0, 0, 1, 0, 0, 0, 0};
  800. int i137[] = {0, 0, 1, 0, 0, 0, 1};
  801. int i138[] = {0, 0, 1, 0, 0, 1, 0};
  802. int i139[] = {0, 0, 1, 0, 0, 1, 1};
  803. int i140[] = {0, 0, 1, 0, 1, 0, 0};
  804. int i141[] = {0, 0, 1, 0, 1, 0, 1};
  805. int i142[] = {0, 0, 1, 0, 1, 1, 0};
  806. int i143[] = {0, 0, 1, 0, 1, 1, 1};
  807. int i144[] = {0, 0, 1, 1, 0, 0, 0};
  808. int i145[] = {0, 0, 1, 1, 0, 0, 1};
  809. int i146[] = {0, 0, 1, 1, 0, 1, 0};
  810. int i147[] = {0, 0, 1, 1, 0, 1, 1};
  811. int i148[] = {0, 0, 1, 1, 1, 0, 0};
  812. int i149[] = {0, 0, 1, 1, 1, 0, 1};
  813. int i150[] = {0, 0, 1, 1, 1, 1, 0};
  814. int i151[] = {0, 0, 1, 1, 1, 1, 1};
  815. int i152[] = {0, 1, 0, 0, 0, 0, 0};
  816. int i153[] = {0, 1, 0, 0, 0, 0, 1};
  817. int i154[] = {0, 1, 0, 0, 0, 1, 0};
  818. int i155[] = {0, 1, 0, 0, 0, 1, 1};
  819. int i156[] = {0, 1, 0, 0, 1, 0, 0};
  820. int i157[] = {0, 1, 0, 0, 1, 0, 1};
  821. int i158[] = {0, 1, 0, 0, 1, 1, 0};
  822. int i159[] = {0, 1, 0, 0, 1, 1, 1};
  823. int i160[] = {0, 1, 0, 1, 0, 0, 0};
  824. int i161[] = {0, 1, 0, 1, 0, 0, 1};
  825. int i162[] = {0, 1, 0, 1, 0, 1, 0};
  826. int i163[] = {0, 1, 0, 1, 0, 1, 1};
  827. int i164[] = {0, 1, 0, 1, 1, 0, 0};
  828. int i165[] = {0, 1, 0, 1, 1, 0, 1};
  829. int i166[] = {0, 1, 0, 1, 1, 1, 0};
  830. int i167[] = {0, 1, 0, 1, 1, 1, 1};
  831. int i168[] = {0, 1, 1, 0, 0, 0, 0};
  832. int i169[] = {0, 1, 1, 0, 0, 0, 1};
  833. int i170[] = {0, 1, 1, 0, 0, 1, 0};
  834. int i171[] = {0, 1, 1, 0, 0, 1, 1};
  835. int i172[] = {0, 1, 1, 0, 1, 0, 0};
  836. int i173[] = {0, 1, 1, 0, 1, 0, 1};
  837. int i174[] = {0, 1, 1, 0, 1, 1, 0};
  838. int i175[] = {0, 1, 1, 0, 1, 1, 1};
  839. int i176[] = {0, 1, 1, 1, 0, 0, 0};
  840. int i177[] = {0, 1, 1, 1, 0, 0, 1};
  841. int i178[] = {0, 1, 1, 1, 0, 1, 0};
  842. int i179[] = {0, 1, 1, 1, 0, 1, 1};
  843. int i180[] = {0, 1, 1, 1, 1, 0, 0};
  844. int i181[] = {0, 1, 1, 1, 1, 0, 1};
  845. int i182[] = {0, 1, 1, 1, 1, 1, 0};
  846. int i183[] = {0, 1, 1, 1, 1, 1, 1};
  847. int i184[] = {1, 0, 0, 0, 0, 0, 0};
  848. int i185[] = {1, 0, 0, 0, 0, 0, 1};
  849. int i186[] = {1, 0, 0, 0, 0, 1, 0};
  850. int i187[] = {1, 0, 0, 0, 0, 1, 1};
  851. int i188[] = {1, 0, 0, 0, 1, 0, 0};
  852. int i189[] = {1, 0, 0, 0, 1, 0, 1};
  853. int i190[] = {1, 0, 0, 0, 1, 1, 0};
  854. int i191[] = {1, 0, 0, 0, 1, 1, 1};
  855. int i192[] = {1, 0, 0, 1, 0, 0, 0};
  856. int i193[] = {1, 0, 0, 1, 0, 0, 1};
  857. int i194[] = {1, 0, 0, 1, 0, 1, 0};
  858. int i195[] = {1, 0, 0, 1, 0, 1, 1};
  859. int i196[] = {1, 0, 0, 1, 1, 0, 0};
  860. int i197[] = {1, 0, 0, 1, 1, 0, 1};
  861. int i198[] = {1, 0, 0, 1, 1, 1, 0};
  862. int i199[] = {1, 0, 0, 1, 1, 1, 1};
  863. int i200[] = {1, 0, 1, 0, 0, 0, 0};
  864. int i201[] = {1, 0, 1, 0, 0, 0, 1};
  865. int i202[] = {1, 0, 1, 0, 0, 1, 0};
  866. int i203[] = {1, 0, 1, 0, 0, 1, 1};
  867. int i204[] = {1, 0, 1, 0, 1, 0, 0};
  868. int i205[] = {1, 0, 1, 0, 1, 0, 1};
  869. int i206[] = {1, 0, 1, 0, 1, 1, 0};
  870. int i207[] = {1, 0, 1, 0, 1, 1, 1};
  871. int i208[] = {1, 0, 1, 1, 0, 0, 0};
  872. int i209[] = {1, 0, 1, 1, 0, 0, 1};
  873. int i210[] = {1, 0, 1, 1, 0, 1, 0};
  874. int i211[] = {1, 0, 1, 1, 0, 1, 1};
  875. int i212[] = {1, 0, 1, 1, 1, 0, 0};
  876. int i213[] = {1, 0, 1, 1, 1, 0, 1};
  877. int i214[] = {1, 0, 1, 1, 1, 1, 0};
  878. int i215[] = {1, 0, 1, 1, 1, 1, 1};
  879. int i216[] = {1, 1, 0, 0, 0, 0, 0};
  880. int i217[] = {1, 1, 0, 0, 0, 0, 1};
  881. int i218[] = {1, 1, 0, 0, 0, 1, 0};
  882. int i219[] = {1, 1, 0, 0, 0, 1, 1};
  883. int i220[] = {1, 1, 0, 0, 1, 0, 0};
  884. int i221[] = {1, 1, 0, 0, 1, 0, 1};
  885. int i222[] = {1, 1, 0, 0, 1, 1, 0};
  886. int i223[] = {1, 1, 0, 0, 1, 1, 1};
  887. int i224[] = {1, 1, 0, 1, 0, 0, 0};
  888. int i225[] = {1, 1, 0, 1, 0, 0, 1};
  889. int i226[] = {1, 1, 0, 1, 0, 1, 0};
  890. int i227[] = {1, 1, 0, 1, 0, 1, 1};
  891. int i228[] = {1, 1, 0, 1, 1, 0, 0};
  892. int i229[] = {1, 1, 0, 1, 1, 0, 1};
  893. int i230[] = {1, 1, 0, 1, 1, 1, 0};
  894. int i231[] = {1, 1, 0, 1, 1, 1, 1};
  895. int i232[] = {1, 1, 1, 0, 0, 0, 0};
  896. int i233[] = {1, 1, 1, 0, 0, 0, 1};
  897. int i234[] = {1, 1, 1, 0, 0, 1, 0};
  898. int i235[] = {1, 1, 1, 0, 0, 1, 1};
  899. int i236[] = {1, 1, 1, 0, 1, 0, 0};
  900. int i237[] = {1, 1, 1, 0, 1, 0, 1};
  901. int i238[] = {1, 1, 1, 0, 1, 1, 0};
  902. int i239[] = {1, 1, 1, 0, 1, 1, 1};
  903. int i240[] = {1, 1, 1, 1, 0, 0, 0};
  904. int i241[] = {1, 1, 1, 1, 0, 0, 1};
  905. int i242[] = {1, 1, 1, 1, 0, 1, 0};
  906. int i243[] = {1, 1, 1, 1, 0, 1, 1};
  907. int i244[] = {1, 1, 1, 1, 1, 0, 0};
  908. int i245[] = {1, 1, 1, 1, 1, 0, 1};
  909. int i246[] = {1, 1, 1, 1, 1, 1, 0};
  910. is_heap_until(i120, i120+7, std::greater<int>()).check([&](int *r){ CHECK(r == i120+7); });
  911. is_heap_until(i121, i121+7, std::greater<int>()).check([&](int *r){ CHECK(r == i121+7); });
  912. is_heap_until(i122, i122+7, std::greater<int>()).check([&](int *r){ CHECK(r == i122+7); });
  913. is_heap_until(i123, i123+7, std::greater<int>()).check([&](int *r){ CHECK(r == i123+7); });
  914. is_heap_until(i124, i124+7, std::greater<int>()).check([&](int *r){ CHECK(r == i124+7); });
  915. is_heap_until(i125, i125+7, std::greater<int>()).check([&](int *r){ CHECK(r == i125+7); });
  916. is_heap_until(i126, i126+7, std::greater<int>()).check([&](int *r){ CHECK(r == i126+7); });
  917. is_heap_until(i127, i127+7, std::greater<int>()).check([&](int *r){ CHECK(r == i127+7); });
  918. is_heap_until(i128, i128+7, std::greater<int>()).check([&](int *r){ CHECK(r == i128+7); });
  919. is_heap_until(i129, i129+7, std::greater<int>()).check([&](int *r){ CHECK(r == i129+7); });
  920. is_heap_until(i130, i130+7, std::greater<int>()).check([&](int *r){ CHECK(r == i130+7); });
  921. is_heap_until(i131, i131+7, std::greater<int>()).check([&](int *r){ CHECK(r == i131+7); });
  922. is_heap_until(i132, i132+7, std::greater<int>()).check([&](int *r){ CHECK(r == i132+7); });
  923. is_heap_until(i133, i133+7, std::greater<int>()).check([&](int *r){ CHECK(r == i133+7); });
  924. is_heap_until(i134, i134+7, std::greater<int>()).check([&](int *r){ CHECK(r == i134+7); });
  925. is_heap_until(i135, i135+7, std::greater<int>()).check([&](int *r){ CHECK(r == i135+7); });
  926. is_heap_until(i136, i136+7, std::greater<int>()).check([&](int *r){ CHECK(r == i136+5); });
  927. is_heap_until(i137, i137+7, std::greater<int>()).check([&](int *r){ CHECK(r == i137+5); });
  928. is_heap_until(i138, i138+7, std::greater<int>()).check([&](int *r){ CHECK(r == i138+6); });
  929. is_heap_until(i139, i139+7, std::greater<int>()).check([&](int *r){ CHECK(r == i139+7); });
  930. is_heap_until(i140, i140+7, std::greater<int>()).check([&](int *r){ CHECK(r == i140+5); });
  931. is_heap_until(i141, i141+7, std::greater<int>()).check([&](int *r){ CHECK(r == i141+5); });
  932. is_heap_until(i142, i142+7, std::greater<int>()).check([&](int *r){ CHECK(r == i142+6); });
  933. is_heap_until(i143, i143+7, std::greater<int>()).check([&](int *r){ CHECK(r == i143+7); });
  934. is_heap_until(i144, i144+7, std::greater<int>()).check([&](int *r){ CHECK(r == i144+5); });
  935. is_heap_until(i145, i145+7, std::greater<int>()).check([&](int *r){ CHECK(r == i145+5); });
  936. is_heap_until(i146, i146+7, std::greater<int>()).check([&](int *r){ CHECK(r == i146+6); });
  937. is_heap_until(i147, i147+7, std::greater<int>()).check([&](int *r){ CHECK(r == i147+7); });
  938. is_heap_until(i148, i148+7, std::greater<int>()).check([&](int *r){ CHECK(r == i148+5); });
  939. is_heap_until(i149, i149+7, std::greater<int>()).check([&](int *r){ CHECK(r == i149+5); });
  940. is_heap_until(i150, i150+7, std::greater<int>()).check([&](int *r){ CHECK(r == i150+6); });
  941. is_heap_until(i151, i151+7, std::greater<int>()).check([&](int *r){ CHECK(r == i151+7); });
  942. is_heap_until(i152, i152+7, std::greater<int>()).check([&](int *r){ CHECK(r == i152+3); });
  943. is_heap_until(i153, i153+7, std::greater<int>()).check([&](int *r){ CHECK(r == i153+3); });
  944. is_heap_until(i154, i154+7, std::greater<int>()).check([&](int *r){ CHECK(r == i154+3); });
  945. is_heap_until(i155, i155+7, std::greater<int>()).check([&](int *r){ CHECK(r == i155+3); });
  946. is_heap_until(i156, i156+7, std::greater<int>()).check([&](int *r){ CHECK(r == i156+3); });
  947. is_heap_until(i157, i157+7, std::greater<int>()).check([&](int *r){ CHECK(r == i157+3); });
  948. is_heap_until(i158, i158+7, std::greater<int>()).check([&](int *r){ CHECK(r == i158+3); });
  949. is_heap_until(i159, i159+7, std::greater<int>()).check([&](int *r){ CHECK(r == i159+3); });
  950. is_heap_until(i160, i160+7, std::greater<int>()).check([&](int *r){ CHECK(r == i160+4); });
  951. is_heap_until(i161, i161+7, std::greater<int>()).check([&](int *r){ CHECK(r == i161+4); });
  952. is_heap_until(i162, i162+7, std::greater<int>()).check([&](int *r){ CHECK(r == i162+4); });
  953. is_heap_until(i163, i163+7, std::greater<int>()).check([&](int *r){ CHECK(r == i163+4); });
  954. is_heap_until(i164, i164+7, std::greater<int>()).check([&](int *r){ CHECK(r == i164+7); });
  955. is_heap_until(i165, i165+7, std::greater<int>()).check([&](int *r){ CHECK(r == i165+7); });
  956. is_heap_until(i166, i166+7, std::greater<int>()).check([&](int *r){ CHECK(r == i166+7); });
  957. is_heap_until(i167, i167+7, std::greater<int>()).check([&](int *r){ CHECK(r == i167+7); });
  958. is_heap_until(i168, i168+7, std::greater<int>()).check([&](int *r){ CHECK(r == i168+3); });
  959. is_heap_until(i169, i169+7, std::greater<int>()).check([&](int *r){ CHECK(r == i169+3); });
  960. is_heap_until(i170, i170+7, std::greater<int>()).check([&](int *r){ CHECK(r == i170+3); });
  961. is_heap_until(i171, i171+7, std::greater<int>()).check([&](int *r){ CHECK(r == i171+3); });
  962. is_heap_until(i172, i172+7, std::greater<int>()).check([&](int *r){ CHECK(r == i172+3); });
  963. is_heap_until(i173, i173+7, std::greater<int>()).check([&](int *r){ CHECK(r == i173+3); });
  964. is_heap_until(i174, i174+7, std::greater<int>()).check([&](int *r){ CHECK(r == i174+3); });
  965. is_heap_until(i175, i175+7, std::greater<int>()).check([&](int *r){ CHECK(r == i175+3); });
  966. is_heap_until(i176, i176+7, std::greater<int>()).check([&](int *r){ CHECK(r == i176+4); });
  967. is_heap_until(i177, i177+7, std::greater<int>()).check([&](int *r){ CHECK(r == i177+4); });
  968. is_heap_until(i178, i178+7, std::greater<int>()).check([&](int *r){ CHECK(r == i178+4); });
  969. is_heap_until(i179, i179+7, std::greater<int>()).check([&](int *r){ CHECK(r == i179+4); });
  970. is_heap_until(i180, i180+7, std::greater<int>()).check([&](int *r){ CHECK(r == i180+5); });
  971. is_heap_until(i181, i181+7, std::greater<int>()).check([&](int *r){ CHECK(r == i181+5); });
  972. is_heap_until(i182, i182+7, std::greater<int>()).check([&](int *r){ CHECK(r == i182+6); });
  973. is_heap_until(i183, i183+7, std::greater<int>()).check([&](int *r){ CHECK(r == i183+7); });
  974. is_heap_until(i184, i184+7, std::greater<int>()).check([&](int *r){ CHECK(r == i184+1); });
  975. is_heap_until(i185, i185+7, std::greater<int>()).check([&](int *r){ CHECK(r == i185+1); });
  976. is_heap_until(i186, i186+7, std::greater<int>()).check([&](int *r){ CHECK(r == i186+1); });
  977. is_heap_until(i187, i187+7, std::greater<int>()).check([&](int *r){ CHECK(r == i187+1); });
  978. is_heap_until(i188, i188+7, std::greater<int>()).check([&](int *r){ CHECK(r == i188+1); });
  979. is_heap_until(i189, i189+7, std::greater<int>()).check([&](int *r){ CHECK(r == i189+1); });
  980. is_heap_until(i190, i190+7, std::greater<int>()).check([&](int *r){ CHECK(r == i190+1); });
  981. is_heap_until(i191, i191+7, std::greater<int>()).check([&](int *r){ CHECK(r == i191+1); });
  982. is_heap_until(i192, i192+7, std::greater<int>()).check([&](int *r){ CHECK(r == i192+1); });
  983. is_heap_until(i193, i193+7, std::greater<int>()).check([&](int *r){ CHECK(r == i193+1); });
  984. is_heap_until(i194, i194+7, std::greater<int>()).check([&](int *r){ CHECK(r == i194+1); });
  985. is_heap_until(i195, i195+7, std::greater<int>()).check([&](int *r){ CHECK(r == i195+1); });
  986. is_heap_until(i196, i196+7, std::greater<int>()).check([&](int *r){ CHECK(r == i196+1); });
  987. is_heap_until(i197, i197+7, std::greater<int>()).check([&](int *r){ CHECK(r == i197+1); });
  988. is_heap_until(i198, i198+7, std::greater<int>()).check([&](int *r){ CHECK(r == i198+1); });
  989. is_heap_until(i199, i199+7, std::greater<int>()).check([&](int *r){ CHECK(r == i199+1); });
  990. is_heap_until(i200, i200+7, std::greater<int>()).check([&](int *r){ CHECK(r == i200+1); });
  991. is_heap_until(i201, i201+7, std::greater<int>()).check([&](int *r){ CHECK(r == i201+1); });
  992. is_heap_until(i202, i202+7, std::greater<int>()).check([&](int *r){ CHECK(r == i202+1); });
  993. is_heap_until(i203, i203+7, std::greater<int>()).check([&](int *r){ CHECK(r == i203+1); });
  994. is_heap_until(i204, i204+7, std::greater<int>()).check([&](int *r){ CHECK(r == i204+1); });
  995. is_heap_until(i205, i205+7, std::greater<int>()).check([&](int *r){ CHECK(r == i205+1); });
  996. is_heap_until(i206, i206+7, std::greater<int>()).check([&](int *r){ CHECK(r == i206+1); });
  997. is_heap_until(i207, i207+7, std::greater<int>()).check([&](int *r){ CHECK(r == i207+1); });
  998. is_heap_until(i208, i208+7, std::greater<int>()).check([&](int *r){ CHECK(r == i208+1); });
  999. is_heap_until(i209, i209+7, std::greater<int>()).check([&](int *r){ CHECK(r == i209+1); });
  1000. is_heap_until(i210, i210+7, std::greater<int>()).check([&](int *r){ CHECK(r == i210+1); });
  1001. is_heap_until(i211, i211+7, std::greater<int>()).check([&](int *r){ CHECK(r == i211+1); });
  1002. is_heap_until(i212, i212+7, std::greater<int>()).check([&](int *r){ CHECK(r == i212+1); });
  1003. is_heap_until(i213, i213+7, std::greater<int>()).check([&](int *r){ CHECK(r == i213+1); });
  1004. is_heap_until(i214, i214+7, std::greater<int>()).check([&](int *r){ CHECK(r == i214+1); });
  1005. is_heap_until(i215, i215+7, std::greater<int>()).check([&](int *r){ CHECK(r == i215+1); });
  1006. is_heap_until(i216, i216+7, std::greater<int>()).check([&](int *r){ CHECK(r == i216+2); });
  1007. is_heap_until(i217, i217+7, std::greater<int>()).check([&](int *r){ CHECK(r == i217+2); });
  1008. is_heap_until(i218, i218+7, std::greater<int>()).check([&](int *r){ CHECK(r == i218+2); });
  1009. is_heap_until(i219, i219+7, std::greater<int>()).check([&](int *r){ CHECK(r == i219+2); });
  1010. is_heap_until(i220, i220+7, std::greater<int>()).check([&](int *r){ CHECK(r == i220+2); });
  1011. is_heap_until(i221, i221+7, std::greater<int>()).check([&](int *r){ CHECK(r == i221+2); });
  1012. is_heap_until(i222, i222+7, std::greater<int>()).check([&](int *r){ CHECK(r == i222+2); });
  1013. is_heap_until(i223, i223+7, std::greater<int>()).check([&](int *r){ CHECK(r == i223+2); });
  1014. is_heap_until(i224, i224+7, std::greater<int>()).check([&](int *r){ CHECK(r == i224+2); });
  1015. is_heap_until(i225, i225+7, std::greater<int>()).check([&](int *r){ CHECK(r == i225+2); });
  1016. is_heap_until(i226, i226+7, std::greater<int>()).check([&](int *r){ CHECK(r == i226+2); });
  1017. is_heap_until(i227, i227+7, std::greater<int>()).check([&](int *r){ CHECK(r == i227+2); });
  1018. is_heap_until(i228, i228+7, std::greater<int>()).check([&](int *r){ CHECK(r == i228+2); });
  1019. is_heap_until(i229, i229+7, std::greater<int>()).check([&](int *r){ CHECK(r == i229+2); });
  1020. is_heap_until(i230, i230+7, std::greater<int>()).check([&](int *r){ CHECK(r == i230+2); });
  1021. is_heap_until(i231, i231+7, std::greater<int>()).check([&](int *r){ CHECK(r == i231+2); });
  1022. is_heap_until(i232, i232+7, std::greater<int>()).check([&](int *r){ CHECK(r == i232+3); });
  1023. is_heap_until(i233, i233+7, std::greater<int>()).check([&](int *r){ CHECK(r == i233+3); });
  1024. is_heap_until(i234, i234+7, std::greater<int>()).check([&](int *r){ CHECK(r == i234+3); });
  1025. is_heap_until(i235, i235+7, std::greater<int>()).check([&](int *r){ CHECK(r == i235+3); });
  1026. is_heap_until(i236, i236+7, std::greater<int>()).check([&](int *r){ CHECK(r == i236+3); });
  1027. is_heap_until(i237, i237+7, std::greater<int>()).check([&](int *r){ CHECK(r == i237+3); });
  1028. is_heap_until(i238, i238+7, std::greater<int>()).check([&](int *r){ CHECK(r == i238+3); });
  1029. is_heap_until(i239, i239+7, std::greater<int>()).check([&](int *r){ CHECK(r == i239+3); });
  1030. is_heap_until(i240, i240+7, std::greater<int>()).check([&](int *r){ CHECK(r == i240+4); });
  1031. is_heap_until(i241, i241+7, std::greater<int>()).check([&](int *r){ CHECK(r == i241+4); });
  1032. is_heap_until(i242, i242+7, std::greater<int>()).check([&](int *r){ CHECK(r == i242+4); });
  1033. is_heap_until(i243, i243+7, std::greater<int>()).check([&](int *r){ CHECK(r == i243+4); });
  1034. is_heap_until(i244, i244+7, std::greater<int>()).check([&](int *r){ CHECK(r == i244+5); });
  1035. is_heap_until(i245, i245+7, std::greater<int>()).check([&](int *r){ CHECK(r == i245+5); });
  1036. is_heap_until(i246, i246+7, std::greater<int>()).check([&](int *r){ CHECK(r == i246+6); });
  1037. #endif
  1038. }
  1039. struct S
  1040. {
  1041. int i;
  1042. };
  1043. int main()
  1044. {
  1045. test_basic();
  1046. test_pred();
  1047. // Test projections:
  1048. S i185[] = {S{1}, S{0}, S{0}, S{0}, S{0}, S{0}, S{1}};
  1049. ::make_testable_1(ranges::is_heap_until)(i185, i185+7, std::greater<int>(), &S::i)
  1050. .check([&](S *r){ CHECK(r == i185+1); });
  1051. // Test rvalue range
  1052. #ifndef RANGES_WORKAROUND_MSVC_573728
  1053. auto res0 = ranges::is_heap_until(std::move(i185), std::greater<int>(), &S::i);
  1054. CHECK(::is_dangling(res0));
  1055. #endif // RANGES_WORKAROUND_MSVC_573728
  1056. std::vector<S> vec(ranges::begin(i185), ranges::end(i185));
  1057. auto res1 = ranges::is_heap_until(std::move(vec), std::greater<int>(), &S::i);
  1058. CHECK(::is_dangling(res1));
  1059. #ifdef IS_HEAP_UNTIL_3
  1060. {
  1061. constexpr test::array<int, 7> i{{1, 0, 0, 0, 0, 0, 1}};
  1062. STATIC_CHECK(ranges::is_heap_until(i, ranges::greater{}) == ranges::begin(i) + 1);
  1063. }
  1064. #endif
  1065. return ::test_result();
  1066. }