ranges 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691
  1. // <ranges> -*- C++ -*-
  2. // Copyright (C) 2019-2021 Free Software Foundation, Inc.
  3. //
  4. // This file is part of the GNU ISO C++ Library. This library is free
  5. // software; you can redistribute it and/or modify it under the
  6. // terms of the GNU General Public License as published by the
  7. // Free Software Foundation; either version 3, or (at your option)
  8. // any later version.
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. // Under Section 7 of GPL version 3, you are granted additional
  14. // permissions described in the GCC Runtime Library Exception, version
  15. // 3.1, as published by the Free Software Foundation.
  16. // You should have received a copy of the GNU General Public License and
  17. // a copy of the GCC Runtime Library Exception along with this program;
  18. // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
  19. // <http://www.gnu.org/licenses/>.
  20. /** @file include/ranges
  21. * This is a Standard C++ Library header.
  22. * @ingroup concepts
  23. */
  24. #ifndef _GLIBCXX_RANGES
  25. #define _GLIBCXX_RANGES 1
  26. #if __cplusplus > 201703L
  27. #pragma GCC system_header
  28. #include <concepts>
  29. #if __cpp_lib_concepts
  30. #include <compare>
  31. #include <initializer_list>
  32. #include <iterator>
  33. #include <optional>
  34. #include <tuple>
  35. #include <bits/ranges_util.h>
  36. #include <bits/refwrap.h>
  37. /**
  38. * @defgroup ranges Ranges
  39. *
  40. * Components for dealing with ranges of elements.
  41. */
  42. namespace std _GLIBCXX_VISIBILITY(default)
  43. {
  44. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  45. namespace ranges
  46. {
  47. // [range.access] customization point objects
  48. // [range.req] range and view concepts
  49. // [range.dangling] dangling iterator handling
  50. // Defined in <bits/ranges_base.h>
  51. // [view.interface] View interface
  52. // [range.subrange] Sub-ranges
  53. // Defined in <bits/ranges_util.h>
  54. // C++20 24.6 [range.factories] Range factories
  55. /// A view that contains no elements.
  56. template<typename _Tp> requires is_object_v<_Tp>
  57. class empty_view
  58. : public view_interface<empty_view<_Tp>>
  59. {
  60. public:
  61. static constexpr _Tp* begin() noexcept { return nullptr; }
  62. static constexpr _Tp* end() noexcept { return nullptr; }
  63. static constexpr _Tp* data() noexcept { return nullptr; }
  64. static constexpr size_t size() noexcept { return 0; }
  65. static constexpr bool empty() noexcept { return true; }
  66. };
  67. template<typename _Tp>
  68. inline constexpr bool enable_borrowed_range<empty_view<_Tp>> = true;
  69. namespace __detail
  70. {
  71. template<typename _Tp>
  72. concept __boxable = copy_constructible<_Tp> && is_object_v<_Tp>;
  73. template<__boxable _Tp>
  74. struct __box : std::optional<_Tp>
  75. {
  76. using std::optional<_Tp>::optional;
  77. constexpr
  78. __box()
  79. noexcept(is_nothrow_default_constructible_v<_Tp>)
  80. requires default_initializable<_Tp>
  81. : std::optional<_Tp>{std::in_place}
  82. { }
  83. __box(const __box&) = default;
  84. __box(__box&&) = default;
  85. using std::optional<_Tp>::operator=;
  86. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  87. // 3477. Simplify constraints for semiregular-box
  88. __box&
  89. operator=(const __box& __that)
  90. noexcept(is_nothrow_copy_constructible_v<_Tp>)
  91. requires (!copyable<_Tp>)
  92. {
  93. if ((bool)__that)
  94. this->emplace(*__that);
  95. else
  96. this->reset();
  97. return *this;
  98. }
  99. __box&
  100. operator=(__box&& __that)
  101. noexcept(is_nothrow_move_constructible_v<_Tp>)
  102. requires (!movable<_Tp>)
  103. {
  104. if ((bool)__that)
  105. this->emplace(std::move(*__that));
  106. else
  107. this->reset();
  108. return *this;
  109. }
  110. };
  111. // For types which are already semiregular, this specialization of the
  112. // semiregular wrapper stores the object directly without going through
  113. // std::optional. It provides just the subset of the primary template's
  114. // API that we currently use.
  115. template<__boxable _Tp> requires semiregular<_Tp>
  116. struct __box<_Tp>
  117. {
  118. private:
  119. [[no_unique_address]] _Tp _M_value = _Tp();
  120. public:
  121. __box() = default;
  122. constexpr explicit
  123. __box(const _Tp& __t)
  124. noexcept(is_nothrow_copy_constructible_v<_Tp>)
  125. : _M_value{__t}
  126. { }
  127. constexpr explicit
  128. __box(_Tp&& __t)
  129. noexcept(is_nothrow_move_constructible_v<_Tp>)
  130. : _M_value{std::move(__t)}
  131. { }
  132. template<typename... _Args>
  133. requires constructible_from<_Tp, _Args...>
  134. constexpr explicit
  135. __box(in_place_t, _Args&&... __args)
  136. noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
  137. : _M_value{std::forward<_Args>(__args)...}
  138. { }
  139. constexpr bool
  140. has_value() const noexcept
  141. { return true; };
  142. constexpr _Tp&
  143. operator*() noexcept
  144. { return _M_value; }
  145. constexpr const _Tp&
  146. operator*() const noexcept
  147. { return _M_value; }
  148. constexpr _Tp*
  149. operator->() noexcept
  150. { return &_M_value; }
  151. constexpr const _Tp*
  152. operator->() const noexcept
  153. { return &_M_value; }
  154. };
  155. } // namespace __detail
  156. /// A view that contains exactly one element.
  157. template<copy_constructible _Tp> requires is_object_v<_Tp>
  158. class single_view : public view_interface<single_view<_Tp>>
  159. {
  160. public:
  161. single_view() = default;
  162. constexpr explicit
  163. single_view(const _Tp& __t)
  164. : _M_value(__t)
  165. { }
  166. constexpr explicit
  167. single_view(_Tp&& __t)
  168. : _M_value(std::move(__t))
  169. { }
  170. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  171. // 3428. single_view's in place constructor should be explicit
  172. template<typename... _Args>
  173. requires constructible_from<_Tp, _Args...>
  174. constexpr explicit
  175. single_view(in_place_t, _Args&&... __args)
  176. : _M_value{in_place, std::forward<_Args>(__args)...}
  177. { }
  178. constexpr _Tp*
  179. begin() noexcept
  180. { return data(); }
  181. constexpr const _Tp*
  182. begin() const noexcept
  183. { return data(); }
  184. constexpr _Tp*
  185. end() noexcept
  186. { return data() + 1; }
  187. constexpr const _Tp*
  188. end() const noexcept
  189. { return data() + 1; }
  190. static constexpr size_t
  191. size() noexcept
  192. { return 1; }
  193. constexpr _Tp*
  194. data() noexcept
  195. { return _M_value.operator->(); }
  196. constexpr const _Tp*
  197. data() const noexcept
  198. { return _M_value.operator->(); }
  199. private:
  200. [[no_unique_address]] __detail::__box<_Tp> _M_value;
  201. };
  202. namespace __detail
  203. {
  204. template<typename _Wp>
  205. constexpr auto __to_signed_like(_Wp __w) noexcept
  206. {
  207. if constexpr (!integral<_Wp>)
  208. return iter_difference_t<_Wp>();
  209. else if constexpr (sizeof(iter_difference_t<_Wp>) > sizeof(_Wp))
  210. return iter_difference_t<_Wp>(__w);
  211. else if constexpr (sizeof(ptrdiff_t) > sizeof(_Wp))
  212. return ptrdiff_t(__w);
  213. else if constexpr (sizeof(long long) > sizeof(_Wp))
  214. return (long long)(__w);
  215. #ifdef __SIZEOF_INT128__
  216. else if constexpr (__SIZEOF_INT128__ > sizeof(_Wp))
  217. return __int128(__w);
  218. #endif
  219. else
  220. return __max_diff_type(__w);
  221. }
  222. template<typename _Wp>
  223. using __iota_diff_t = decltype(__to_signed_like(std::declval<_Wp>()));
  224. template<typename _It>
  225. concept __decrementable = incrementable<_It>
  226. && requires(_It __i)
  227. {
  228. { --__i } -> same_as<_It&>;
  229. { __i-- } -> same_as<_It>;
  230. };
  231. template<typename _It>
  232. concept __advanceable = __decrementable<_It> && totally_ordered<_It>
  233. && requires( _It __i, const _It __j, const __iota_diff_t<_It> __n)
  234. {
  235. { __i += __n } -> same_as<_It&>;
  236. { __i -= __n } -> same_as<_It&>;
  237. _It(__j + __n);
  238. _It(__n + __j);
  239. _It(__j - __n);
  240. { __j - __j } -> convertible_to<__iota_diff_t<_It>>;
  241. };
  242. template<typename _Winc>
  243. struct __iota_view_iter_cat
  244. { };
  245. template<incrementable _Winc>
  246. struct __iota_view_iter_cat<_Winc>
  247. { using iterator_category = input_iterator_tag; };
  248. } // namespace __detail
  249. template<weakly_incrementable _Winc,
  250. semiregular _Bound = unreachable_sentinel_t>
  251. requires std::__detail::__weakly_eq_cmp_with<_Winc, _Bound>
  252. && semiregular<_Winc>
  253. class iota_view : public view_interface<iota_view<_Winc, _Bound>>
  254. {
  255. private:
  256. struct _Sentinel;
  257. struct _Iterator : __detail::__iota_view_iter_cat<_Winc>
  258. {
  259. private:
  260. static auto
  261. _S_iter_concept()
  262. {
  263. using namespace __detail;
  264. if constexpr (__advanceable<_Winc>)
  265. return random_access_iterator_tag{};
  266. else if constexpr (__decrementable<_Winc>)
  267. return bidirectional_iterator_tag{};
  268. else if constexpr (incrementable<_Winc>)
  269. return forward_iterator_tag{};
  270. else
  271. return input_iterator_tag{};
  272. }
  273. public:
  274. using iterator_concept = decltype(_S_iter_concept());
  275. // iterator_category defined in __iota_view_iter_cat
  276. using value_type = _Winc;
  277. using difference_type = __detail::__iota_diff_t<_Winc>;
  278. _Iterator() = default;
  279. constexpr explicit
  280. _Iterator(_Winc __value)
  281. : _M_value(__value) { }
  282. constexpr _Winc
  283. operator*() const noexcept(is_nothrow_copy_constructible_v<_Winc>)
  284. { return _M_value; }
  285. constexpr _Iterator&
  286. operator++()
  287. {
  288. ++_M_value;
  289. return *this;
  290. }
  291. constexpr void
  292. operator++(int)
  293. { ++*this; }
  294. constexpr _Iterator
  295. operator++(int) requires incrementable<_Winc>
  296. {
  297. auto __tmp = *this;
  298. ++*this;
  299. return __tmp;
  300. }
  301. constexpr _Iterator&
  302. operator--() requires __detail::__decrementable<_Winc>
  303. {
  304. --_M_value;
  305. return *this;
  306. }
  307. constexpr _Iterator
  308. operator--(int) requires __detail::__decrementable<_Winc>
  309. {
  310. auto __tmp = *this;
  311. --*this;
  312. return __tmp;
  313. }
  314. constexpr _Iterator&
  315. operator+=(difference_type __n) requires __detail::__advanceable<_Winc>
  316. {
  317. using __detail::__is_integer_like;
  318. using __detail::__is_signed_integer_like;
  319. if constexpr (__is_integer_like<_Winc>
  320. && !__is_signed_integer_like<_Winc>)
  321. {
  322. if (__n >= difference_type(0))
  323. _M_value += static_cast<_Winc>(__n);
  324. else
  325. _M_value -= static_cast<_Winc>(-__n);
  326. }
  327. else
  328. _M_value += __n;
  329. return *this;
  330. }
  331. constexpr _Iterator&
  332. operator-=(difference_type __n) requires __detail::__advanceable<_Winc>
  333. {
  334. using __detail::__is_integer_like;
  335. using __detail::__is_signed_integer_like;
  336. if constexpr (__is_integer_like<_Winc>
  337. && !__is_signed_integer_like<_Winc>)
  338. {
  339. if (__n >= difference_type(0))
  340. _M_value -= static_cast<_Winc>(__n);
  341. else
  342. _M_value += static_cast<_Winc>(-__n);
  343. }
  344. else
  345. _M_value -= __n;
  346. return *this;
  347. }
  348. constexpr _Winc
  349. operator[](difference_type __n) const
  350. requires __detail::__advanceable<_Winc>
  351. { return _Winc(_M_value + __n); }
  352. friend constexpr bool
  353. operator==(const _Iterator& __x, const _Iterator& __y)
  354. requires equality_comparable<_Winc>
  355. { return __x._M_value == __y._M_value; }
  356. friend constexpr bool
  357. operator<(const _Iterator& __x, const _Iterator& __y)
  358. requires totally_ordered<_Winc>
  359. { return __x._M_value < __y._M_value; }
  360. friend constexpr bool
  361. operator>(const _Iterator& __x, const _Iterator& __y)
  362. requires totally_ordered<_Winc>
  363. { return __y < __x; }
  364. friend constexpr bool
  365. operator<=(const _Iterator& __x, const _Iterator& __y)
  366. requires totally_ordered<_Winc>
  367. { return !(__y < __x); }
  368. friend constexpr bool
  369. operator>=(const _Iterator& __x, const _Iterator& __y)
  370. requires totally_ordered<_Winc>
  371. { return !(__x < __y); }
  372. #ifdef __cpp_lib_three_way_comparison
  373. friend constexpr auto
  374. operator<=>(const _Iterator& __x, const _Iterator& __y)
  375. requires totally_ordered<_Winc> && three_way_comparable<_Winc>
  376. { return __x._M_value <=> __y._M_value; }
  377. #endif
  378. friend constexpr _Iterator
  379. operator+(_Iterator __i, difference_type __n)
  380. requires __detail::__advanceable<_Winc>
  381. { return __i += __n; }
  382. friend constexpr _Iterator
  383. operator+(difference_type __n, _Iterator __i)
  384. requires __detail::__advanceable<_Winc>
  385. { return __i += __n; }
  386. friend constexpr _Iterator
  387. operator-(_Iterator __i, difference_type __n)
  388. requires __detail::__advanceable<_Winc>
  389. { return __i -= __n; }
  390. friend constexpr difference_type
  391. operator-(const _Iterator& __x, const _Iterator& __y)
  392. requires __detail::__advanceable<_Winc>
  393. {
  394. using __detail::__is_integer_like;
  395. using __detail::__is_signed_integer_like;
  396. using _Dt = difference_type;
  397. if constexpr (__is_integer_like<_Winc>)
  398. {
  399. if constexpr (__is_signed_integer_like<_Winc>)
  400. return _Dt(_Dt(__x._M_value) - _Dt(__y._M_value));
  401. else
  402. return (__y._M_value > __x._M_value)
  403. ? _Dt(-_Dt(__y._M_value - __x._M_value))
  404. : _Dt(__x._M_value - __y._M_value);
  405. }
  406. else
  407. return __x._M_value - __y._M_value;
  408. }
  409. private:
  410. _Winc _M_value = _Winc();
  411. friend _Sentinel;
  412. };
  413. struct _Sentinel
  414. {
  415. private:
  416. constexpr bool
  417. _M_equal(const _Iterator& __x) const
  418. { return __x._M_value == _M_bound; }
  419. _Bound _M_bound = _Bound();
  420. public:
  421. _Sentinel() = default;
  422. constexpr explicit
  423. _Sentinel(_Bound __bound)
  424. : _M_bound(__bound) { }
  425. friend constexpr bool
  426. operator==(const _Iterator& __x, const _Sentinel& __y)
  427. { return __y._M_equal(__x); }
  428. friend constexpr iter_difference_t<_Winc>
  429. operator-(const _Iterator& __x, const _Sentinel& __y)
  430. requires sized_sentinel_for<_Bound, _Winc>
  431. { return __x._M_value - __y._M_bound; }
  432. friend constexpr iter_difference_t<_Winc>
  433. operator-(const _Sentinel& __x, const _Iterator& __y)
  434. requires sized_sentinel_for<_Bound, _Winc>
  435. { return -(__y - __x); }
  436. };
  437. _Winc _M_value = _Winc();
  438. [[no_unique_address]] _Bound _M_bound = _Bound();
  439. public:
  440. iota_view() = default;
  441. constexpr explicit
  442. iota_view(_Winc __value)
  443. : _M_value(__value)
  444. { }
  445. constexpr
  446. iota_view(type_identity_t<_Winc> __value,
  447. type_identity_t<_Bound> __bound)
  448. : _M_value(__value), _M_bound(__bound)
  449. {
  450. if constexpr (totally_ordered_with<_Winc, _Bound>)
  451. __glibcxx_assert( bool(__value <= __bound) );
  452. }
  453. constexpr _Iterator
  454. begin() const { return _Iterator{_M_value}; }
  455. constexpr auto
  456. end() const
  457. {
  458. if constexpr (same_as<_Bound, unreachable_sentinel_t>)
  459. return unreachable_sentinel;
  460. else
  461. return _Sentinel{_M_bound};
  462. }
  463. constexpr _Iterator
  464. end() const requires same_as<_Winc, _Bound>
  465. { return _Iterator{_M_bound}; }
  466. constexpr auto
  467. size() const
  468. requires (same_as<_Winc, _Bound> && __detail::__advanceable<_Winc>)
  469. || (integral<_Winc> && integral<_Bound>)
  470. || sized_sentinel_for<_Bound, _Winc>
  471. {
  472. using __detail::__is_integer_like;
  473. using __detail::__to_unsigned_like;
  474. if constexpr (integral<_Winc> && integral<_Bound>)
  475. {
  476. using _Up = make_unsigned_t<decltype(_M_bound - _M_value)>;
  477. return _Up(_M_bound) - _Up(_M_value);
  478. }
  479. else if constexpr (__is_integer_like<_Winc>)
  480. return __to_unsigned_like(_M_bound) - __to_unsigned_like(_M_value);
  481. else
  482. return __to_unsigned_like(_M_bound - _M_value);
  483. }
  484. };
  485. template<typename _Winc, typename _Bound>
  486. requires (!__detail::__is_integer_like<_Winc>
  487. || !__detail::__is_integer_like<_Bound>
  488. || (__detail::__is_signed_integer_like<_Winc>
  489. == __detail::__is_signed_integer_like<_Bound>))
  490. iota_view(_Winc, _Bound) -> iota_view<_Winc, _Bound>;
  491. template<weakly_incrementable _Winc, semiregular _Bound>
  492. inline constexpr bool
  493. enable_borrowed_range<iota_view<_Winc, _Bound>> = true;
  494. namespace views
  495. {
  496. template<typename _Tp>
  497. inline constexpr empty_view<_Tp> empty{};
  498. struct _Single
  499. {
  500. template<typename _Tp>
  501. constexpr auto
  502. operator()(_Tp&& __e) const
  503. { return single_view{std::forward<_Tp>(__e)}; }
  504. };
  505. inline constexpr _Single single{};
  506. struct _Iota
  507. {
  508. template<typename _Tp>
  509. constexpr auto
  510. operator()(_Tp&& __e) const
  511. { return iota_view{std::forward<_Tp>(__e)}; }
  512. template<typename _Tp, typename _Up>
  513. constexpr auto
  514. operator()(_Tp&& __e, _Up&& __f) const
  515. { return iota_view{std::forward<_Tp>(__e), std::forward<_Up>(__f)}; }
  516. };
  517. inline constexpr _Iota iota{};
  518. } // namespace views
  519. namespace __detail
  520. {
  521. template<typename _Val, typename _CharT, typename _Traits>
  522. concept __stream_extractable
  523. = requires(basic_istream<_CharT, _Traits>& is, _Val& t) { is >> t; };
  524. } // namespace __detail
  525. template<movable _Val, typename _CharT, typename _Traits>
  526. requires default_initializable<_Val>
  527. && __detail::__stream_extractable<_Val, _CharT, _Traits>
  528. class basic_istream_view
  529. : public view_interface<basic_istream_view<_Val, _CharT, _Traits>>
  530. {
  531. public:
  532. basic_istream_view() = default;
  533. constexpr explicit
  534. basic_istream_view(basic_istream<_CharT, _Traits>& __stream)
  535. : _M_stream(std::__addressof(__stream))
  536. { }
  537. constexpr auto
  538. begin()
  539. {
  540. if (_M_stream != nullptr)
  541. *_M_stream >> _M_object;
  542. return _Iterator{this};
  543. }
  544. constexpr default_sentinel_t
  545. end() const noexcept
  546. { return default_sentinel; }
  547. private:
  548. basic_istream<_CharT, _Traits>* _M_stream = nullptr;
  549. _Val _M_object = _Val();
  550. struct _Iterator
  551. {
  552. public:
  553. using iterator_concept = input_iterator_tag;
  554. using difference_type = ptrdiff_t;
  555. using value_type = _Val;
  556. _Iterator() = default;
  557. constexpr explicit
  558. _Iterator(basic_istream_view* __parent) noexcept
  559. : _M_parent(__parent)
  560. { }
  561. _Iterator(const _Iterator&) = delete;
  562. _Iterator(_Iterator&&) = default;
  563. _Iterator& operator=(const _Iterator&) = delete;
  564. _Iterator& operator=(_Iterator&&) = default;
  565. _Iterator&
  566. operator++()
  567. {
  568. __glibcxx_assert(_M_parent->_M_stream != nullptr);
  569. *_M_parent->_M_stream >> _M_parent->_M_object;
  570. return *this;
  571. }
  572. void
  573. operator++(int)
  574. { ++*this; }
  575. _Val&
  576. operator*() const
  577. {
  578. __glibcxx_assert(_M_parent->_M_stream != nullptr);
  579. return _M_parent->_M_object;
  580. }
  581. friend bool
  582. operator==(const _Iterator& __x, default_sentinel_t)
  583. { return __x._M_at_end(); }
  584. private:
  585. basic_istream_view* _M_parent = nullptr;
  586. bool
  587. _M_at_end() const
  588. { return _M_parent == nullptr || !*_M_parent->_M_stream; }
  589. };
  590. friend _Iterator;
  591. };
  592. template<typename _Val, typename _CharT, typename _Traits>
  593. basic_istream_view<_Val, _CharT, _Traits>
  594. istream_view(basic_istream<_CharT, _Traits>& __s)
  595. { return basic_istream_view<_Val, _CharT, _Traits>{__s}; }
  596. // C++20 24.7 [range.adaptors] Range adaptors
  597. namespace __detail
  598. {
  599. struct _Empty { };
  600. // Alias for a type that is conditionally present
  601. // (and is an empty type otherwise).
  602. // Data members using this alias should use [[no_unique_address]] so that
  603. // they take no space when not needed.
  604. template<bool _Present, typename _Tp>
  605. using __maybe_present_t = conditional_t<_Present, _Tp, _Empty>;
  606. // Alias for a type that is conditionally const.
  607. template<bool _Const, typename _Tp>
  608. using __maybe_const_t = conditional_t<_Const, const _Tp, _Tp>;
  609. } // namespace __detail
  610. namespace views::__adaptor
  611. {
  612. // True if the range adaptor _Adaptor can be applied with _Args.
  613. template<typename _Adaptor, typename... _Args>
  614. concept __adaptor_invocable
  615. = requires { std::declval<_Adaptor>()(declval<_Args>()...); };
  616. // True if the range adaptor non-closure _Adaptor can be partially applied
  617. // with _Args.
  618. template<typename _Adaptor, typename... _Args>
  619. concept __adaptor_partial_app_viable = (_Adaptor::_S_arity > 1)
  620. && (sizeof...(_Args) == _Adaptor::_S_arity - 1)
  621. && (constructible_from<decay_t<_Args>, _Args> && ...);
  622. template<typename _Adaptor, typename... _Args>
  623. struct _Partial;
  624. template<typename _Lhs, typename _Rhs>
  625. struct _Pipe;
  626. // The base class of every range adaptor closure.
  627. struct _RangeAdaptorClosure
  628. {
  629. // range | adaptor is equivalent to adaptor(range).
  630. template<typename _Self, typename _Range>
  631. requires derived_from<remove_cvref_t<_Self>, _RangeAdaptorClosure>
  632. && __adaptor_invocable<_Self, _Range>
  633. friend constexpr auto
  634. operator|(_Range&& __r, _Self&& __self)
  635. { return std::forward<_Self>(__self)(std::forward<_Range>(__r)); }
  636. // Compose the adaptors __lhs and __rhs into a pipeline, returning
  637. // another range adaptor closure object.
  638. template<typename _Lhs, typename _Rhs>
  639. requires derived_from<_Lhs, _RangeAdaptorClosure>
  640. && derived_from<_Rhs, _RangeAdaptorClosure>
  641. friend constexpr auto
  642. operator|(_Lhs __lhs, _Rhs __rhs)
  643. { return _Pipe<_Lhs, _Rhs>{std::move(__lhs), std::move(__rhs)}; }
  644. };
  645. // The base class of every range adaptor non-closure.
  646. //
  647. // The static data member _Derived::_S_arity must contain the total number of
  648. // arguments that the adaptor takes, and the class _Derived must introduce
  649. // _RangeAdaptor::operator() into the class scope via a using-declaration.
  650. template<typename _Derived>
  651. struct _RangeAdaptor
  652. {
  653. // Partially apply the arguments __args to the range adaptor _Derived,
  654. // returning a range adaptor closure object.
  655. template<typename... _Args>
  656. requires __adaptor_partial_app_viable<_Derived, _Args...>
  657. constexpr auto
  658. operator()(_Args&&... __args) const
  659. {
  660. return _Partial<_Derived, decay_t<_Args>...>{std::forward<_Args>(__args)...};
  661. }
  662. };
  663. // A range adaptor closure that represents partial application of
  664. // the range adaptor _Adaptor with arguments _Args.
  665. template<typename _Adaptor, typename... _Args>
  666. struct _Partial : _RangeAdaptorClosure
  667. {
  668. tuple<_Args...> _M_args;
  669. constexpr
  670. _Partial(_Args... __args)
  671. : _M_args(std::move(__args)...)
  672. { }
  673. // Invoke _Adaptor with arguments __r, _M_args... according to the
  674. // value category of the range adaptor closure object.
  675. template<typename _Range>
  676. requires __adaptor_invocable<_Adaptor, _Range, const _Args&...>
  677. constexpr auto
  678. operator()(_Range&& __r) const &
  679. {
  680. auto __forwarder = [&__r] (const auto&... __args) {
  681. return _Adaptor{}(std::forward<_Range>(__r), __args...);
  682. };
  683. return std::apply(__forwarder, _M_args);
  684. }
  685. template<typename _Range>
  686. requires __adaptor_invocable<_Adaptor, _Range, _Args...>
  687. constexpr auto
  688. operator()(_Range&& __r) &&
  689. {
  690. auto __forwarder = [&__r] (auto&... __args) {
  691. return _Adaptor{}(std::forward<_Range>(__r), std::move(__args)...);
  692. };
  693. return std::apply(__forwarder, _M_args);
  694. }
  695. template<typename _Range>
  696. constexpr auto
  697. operator()(_Range&& __r) const && = delete;
  698. };
  699. // A lightweight specialization of the above primary template for
  700. // the common case where _Adaptor accepts a single extra argument.
  701. template<typename _Adaptor, typename _Arg>
  702. struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure
  703. {
  704. _Arg _M_arg;
  705. constexpr
  706. _Partial(_Arg __arg)
  707. : _M_arg(std::move(__arg))
  708. { }
  709. template<typename _Range>
  710. requires __adaptor_invocable<_Adaptor, _Range, const _Arg&>
  711. constexpr auto
  712. operator()(_Range&& __r) const &
  713. { return _Adaptor{}(std::forward<_Range>(__r), _M_arg); }
  714. template<typename _Range>
  715. requires __adaptor_invocable<_Adaptor, _Range, _Arg>
  716. constexpr auto
  717. operator()(_Range&& __r) &&
  718. { return _Adaptor{}(std::forward<_Range>(__r), std::move(_M_arg)); }
  719. template<typename _Range>
  720. constexpr auto
  721. operator()(_Range&& __r) const && = delete;
  722. };
  723. template<typename _Lhs, typename _Rhs, typename _Range>
  724. concept __pipe_invocable
  725. = requires { std::declval<_Rhs>()(std::declval<_Lhs>()(std::declval<_Range>())); };
  726. // A range adaptor closure that represents composition of the range
  727. // adaptor closures _Lhs and _Rhs.
  728. template<typename _Lhs, typename _Rhs>
  729. struct _Pipe : _RangeAdaptorClosure
  730. {
  731. [[no_unique_address]] _Lhs _M_lhs;
  732. [[no_unique_address]] _Rhs _M_rhs;
  733. constexpr
  734. _Pipe(_Lhs __lhs, _Rhs __rhs)
  735. : _M_lhs(std::move(__lhs)), _M_rhs(std::move(__rhs))
  736. { }
  737. // Invoke _M_rhs(_M_lhs(__r)) according to the value category of this
  738. // range adaptor closure object.
  739. template<typename _Range>
  740. requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range>
  741. constexpr auto
  742. operator()(_Range&& __r) const &
  743. { return _M_rhs(_M_lhs(std::forward<_Range>(__r))); }
  744. template<typename _Range>
  745. requires __pipe_invocable<_Lhs, _Rhs, _Range>
  746. constexpr auto
  747. operator()(_Range&& __r) &&
  748. { return std::move(_M_rhs)(std::move(_M_lhs)(std::forward<_Range>(__r))); }
  749. template<typename _Range>
  750. constexpr auto
  751. operator()(_Range&& __r) const && = delete;
  752. };
  753. } // namespace views::__adaptor
  754. template<range _Range> requires is_object_v<_Range>
  755. class ref_view : public view_interface<ref_view<_Range>>
  756. {
  757. private:
  758. _Range* _M_r = nullptr;
  759. static void _S_fun(_Range&); // not defined
  760. static void _S_fun(_Range&&) = delete;
  761. public:
  762. constexpr
  763. ref_view() noexcept = default;
  764. template<__detail::__not_same_as<ref_view> _Tp>
  765. requires convertible_to<_Tp, _Range&>
  766. && requires { _S_fun(declval<_Tp>()); }
  767. constexpr
  768. ref_view(_Tp&& __t)
  769. : _M_r(std::__addressof(static_cast<_Range&>(std::forward<_Tp>(__t))))
  770. { }
  771. constexpr _Range&
  772. base() const
  773. { return *_M_r; }
  774. constexpr iterator_t<_Range>
  775. begin() const
  776. { return ranges::begin(*_M_r); }
  777. constexpr sentinel_t<_Range>
  778. end() const
  779. { return ranges::end(*_M_r); }
  780. constexpr bool
  781. empty() const requires requires { ranges::empty(*_M_r); }
  782. { return ranges::empty(*_M_r); }
  783. constexpr auto
  784. size() const requires sized_range<_Range>
  785. { return ranges::size(*_M_r); }
  786. constexpr auto
  787. data() const requires contiguous_range<_Range>
  788. { return ranges::data(*_M_r); }
  789. };
  790. template<typename _Range>
  791. ref_view(_Range&) -> ref_view<_Range>;
  792. template<typename _Tp>
  793. inline constexpr bool enable_borrowed_range<ref_view<_Tp>> = true;
  794. namespace views
  795. {
  796. namespace __detail
  797. {
  798. template<typename _Range>
  799. concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; };
  800. template<typename _Range>
  801. concept __can_subrange = requires { subrange{std::declval<_Range>()}; };
  802. } // namespace __detail
  803. struct _All : __adaptor::_RangeAdaptorClosure
  804. {
  805. template<viewable_range _Range>
  806. requires view<decay_t<_Range>>
  807. || __detail::__can_ref_view<_Range>
  808. || __detail::__can_subrange<_Range>
  809. constexpr auto
  810. operator()(_Range&& __r) const
  811. {
  812. if constexpr (view<decay_t<_Range>>)
  813. return std::forward<_Range>(__r);
  814. else if constexpr (__detail::__can_ref_view<_Range>)
  815. return ref_view{std::forward<_Range>(__r)};
  816. else
  817. return subrange{std::forward<_Range>(__r)};
  818. }
  819. };
  820. inline constexpr _All all;
  821. template<viewable_range _Range>
  822. using all_t = decltype(all(std::declval<_Range>()));
  823. } // namespace views
  824. // The following simple algos are transcribed from ranges_algo.h to avoid
  825. // having to include that entire header.
  826. namespace __detail
  827. {
  828. template<typename _Iter, typename _Sent, typename _Tp>
  829. constexpr _Iter
  830. find(_Iter __first, _Sent __last, const _Tp& __value)
  831. {
  832. while (__first != __last
  833. && !(bool)(*__first == __value))
  834. ++__first;
  835. return __first;
  836. }
  837. template<typename _Iter, typename _Sent, typename _Pred>
  838. constexpr _Iter
  839. find_if(_Iter __first, _Sent __last, _Pred __pred)
  840. {
  841. while (__first != __last
  842. && !(bool)std::__invoke(__pred, *__first))
  843. ++__first;
  844. return __first;
  845. }
  846. template<typename _Iter, typename _Sent, typename _Pred>
  847. constexpr _Iter
  848. find_if_not(_Iter __first, _Sent __last, _Pred __pred)
  849. {
  850. while (__first != __last
  851. && (bool)std::__invoke(__pred, *__first))
  852. ++__first;
  853. return __first;
  854. }
  855. template<typename _Iter1, typename _Sent1, typename _Iter2, typename _Sent2>
  856. constexpr pair<_Iter1, _Iter2>
  857. mismatch(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2)
  858. {
  859. while (__first1 != __last1 && __first2 != __last2
  860. && (bool)ranges::equal_to{}(*__first1, *__first2))
  861. {
  862. ++__first1;
  863. ++__first2;
  864. }
  865. return { std::move(__first1), std::move(__first2) };
  866. }
  867. } // namespace __detail
  868. namespace __detail
  869. {
  870. template<range _Range>
  871. struct _CachedPosition
  872. {
  873. constexpr bool
  874. _M_has_value() const
  875. { return false; }
  876. constexpr iterator_t<_Range>
  877. _M_get(const _Range&) const
  878. {
  879. __glibcxx_assert(false);
  880. return {};
  881. }
  882. constexpr void
  883. _M_set(const _Range&, const iterator_t<_Range>&) const
  884. { }
  885. };
  886. template<forward_range _Range>
  887. struct _CachedPosition<_Range>
  888. {
  889. private:
  890. iterator_t<_Range> _M_iter{};
  891. public:
  892. constexpr bool
  893. _M_has_value() const
  894. { return _M_iter != iterator_t<_Range>{}; }
  895. constexpr iterator_t<_Range>
  896. _M_get(const _Range&) const
  897. {
  898. __glibcxx_assert(_M_has_value());
  899. return _M_iter;
  900. }
  901. constexpr void
  902. _M_set(const _Range&, const iterator_t<_Range>& __it)
  903. {
  904. __glibcxx_assert(!_M_has_value());
  905. _M_iter = __it;
  906. }
  907. };
  908. template<random_access_range _Range>
  909. requires (sizeof(range_difference_t<_Range>)
  910. <= sizeof(iterator_t<_Range>))
  911. struct _CachedPosition<_Range>
  912. {
  913. private:
  914. range_difference_t<_Range> _M_offset = -1;
  915. public:
  916. constexpr bool
  917. _M_has_value() const
  918. { return _M_offset >= 0; }
  919. constexpr iterator_t<_Range>
  920. _M_get(_Range& __r) const
  921. {
  922. __glibcxx_assert(_M_has_value());
  923. return ranges::begin(__r) + _M_offset;
  924. }
  925. constexpr void
  926. _M_set(_Range& __r, const iterator_t<_Range>& __it)
  927. {
  928. __glibcxx_assert(!_M_has_value());
  929. _M_offset = __it - ranges::begin(__r);
  930. }
  931. };
  932. } // namespace __detail
  933. namespace __detail
  934. {
  935. template<typename _Base>
  936. struct __filter_view_iter_cat
  937. { };
  938. template<forward_range _Base>
  939. struct __filter_view_iter_cat<_Base>
  940. {
  941. private:
  942. static auto
  943. _S_iter_cat()
  944. {
  945. using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category;
  946. if constexpr (derived_from<_Cat, bidirectional_iterator_tag>)
  947. return bidirectional_iterator_tag{};
  948. else if constexpr (derived_from<_Cat, forward_iterator_tag>)
  949. return forward_iterator_tag{};
  950. else
  951. return _Cat{};
  952. }
  953. public:
  954. using iterator_category = decltype(_S_iter_cat());
  955. };
  956. } // namespace __detail
  957. template<input_range _Vp,
  958. indirect_unary_predicate<iterator_t<_Vp>> _Pred>
  959. requires view<_Vp> && is_object_v<_Pred>
  960. class filter_view : public view_interface<filter_view<_Vp, _Pred>>
  961. {
  962. private:
  963. struct _Sentinel;
  964. struct _Iterator : __detail::__filter_view_iter_cat<_Vp>
  965. {
  966. private:
  967. static constexpr auto
  968. _S_iter_concept()
  969. {
  970. if constexpr (bidirectional_range<_Vp>)
  971. return bidirectional_iterator_tag{};
  972. else if constexpr (forward_range<_Vp>)
  973. return forward_iterator_tag{};
  974. else
  975. return input_iterator_tag{};
  976. }
  977. friend filter_view;
  978. using _Vp_iter = iterator_t<_Vp>;
  979. _Vp_iter _M_current = _Vp_iter();
  980. filter_view* _M_parent = nullptr;
  981. public:
  982. using iterator_concept = decltype(_S_iter_concept());
  983. // iterator_category defined in __filter_view_iter_cat
  984. using value_type = range_value_t<_Vp>;
  985. using difference_type = range_difference_t<_Vp>;
  986. _Iterator() = default;
  987. constexpr
  988. _Iterator(filter_view* __parent, _Vp_iter __current)
  989. : _M_current(std::move(__current)),
  990. _M_parent(__parent)
  991. { }
  992. constexpr _Vp_iter
  993. base() const &
  994. requires copyable<_Vp_iter>
  995. { return _M_current; }
  996. constexpr _Vp_iter
  997. base() &&
  998. { return std::move(_M_current); }
  999. constexpr range_reference_t<_Vp>
  1000. operator*() const
  1001. { return *_M_current; }
  1002. constexpr _Vp_iter
  1003. operator->() const
  1004. requires __detail::__has_arrow<_Vp_iter>
  1005. && copyable<_Vp_iter>
  1006. { return _M_current; }
  1007. constexpr _Iterator&
  1008. operator++()
  1009. {
  1010. _M_current = __detail::find_if(std::move(++_M_current),
  1011. ranges::end(_M_parent->_M_base),
  1012. std::ref(*_M_parent->_M_pred));
  1013. return *this;
  1014. }
  1015. constexpr void
  1016. operator++(int)
  1017. { ++*this; }
  1018. constexpr _Iterator
  1019. operator++(int) requires forward_range<_Vp>
  1020. {
  1021. auto __tmp = *this;
  1022. ++*this;
  1023. return __tmp;
  1024. }
  1025. constexpr _Iterator&
  1026. operator--() requires bidirectional_range<_Vp>
  1027. {
  1028. do
  1029. --_M_current;
  1030. while (!std::__invoke(*_M_parent->_M_pred, *_M_current));
  1031. return *this;
  1032. }
  1033. constexpr _Iterator
  1034. operator--(int) requires bidirectional_range<_Vp>
  1035. {
  1036. auto __tmp = *this;
  1037. --*this;
  1038. return __tmp;
  1039. }
  1040. friend constexpr bool
  1041. operator==(const _Iterator& __x, const _Iterator& __y)
  1042. requires equality_comparable<_Vp_iter>
  1043. { return __x._M_current == __y._M_current; }
  1044. friend constexpr range_rvalue_reference_t<_Vp>
  1045. iter_move(const _Iterator& __i)
  1046. noexcept(noexcept(ranges::iter_move(__i._M_current)))
  1047. { return ranges::iter_move(__i._M_current); }
  1048. friend constexpr void
  1049. iter_swap(const _Iterator& __x, const _Iterator& __y)
  1050. noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
  1051. requires indirectly_swappable<_Vp_iter>
  1052. { ranges::iter_swap(__x._M_current, __y._M_current); }
  1053. };
  1054. struct _Sentinel
  1055. {
  1056. private:
  1057. sentinel_t<_Vp> _M_end = sentinel_t<_Vp>();
  1058. constexpr bool
  1059. __equal(const _Iterator& __i) const
  1060. { return __i._M_current == _M_end; }
  1061. public:
  1062. _Sentinel() = default;
  1063. constexpr explicit
  1064. _Sentinel(filter_view* __parent)
  1065. : _M_end(ranges::end(__parent->_M_base))
  1066. { }
  1067. constexpr sentinel_t<_Vp>
  1068. base() const
  1069. { return _M_end; }
  1070. friend constexpr bool
  1071. operator==(const _Iterator& __x, const _Sentinel& __y)
  1072. { return __y.__equal(__x); }
  1073. };
  1074. [[no_unique_address]] __detail::__box<_Pred> _M_pred;
  1075. [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
  1076. _Vp _M_base = _Vp();
  1077. public:
  1078. filter_view() = default;
  1079. constexpr
  1080. filter_view(_Vp __base, _Pred __pred)
  1081. : _M_pred(std::move(__pred)), _M_base(std::move(__base))
  1082. { }
  1083. constexpr _Vp
  1084. base() const& requires copy_constructible<_Vp>
  1085. { return _M_base; }
  1086. constexpr _Vp
  1087. base() &&
  1088. { return std::move(_M_base); }
  1089. constexpr const _Pred&
  1090. pred() const
  1091. { return *_M_pred; }
  1092. constexpr _Iterator
  1093. begin()
  1094. {
  1095. if (_M_cached_begin._M_has_value())
  1096. return {this, _M_cached_begin._M_get(_M_base)};
  1097. __glibcxx_assert(_M_pred.has_value());
  1098. auto __it = __detail::find_if(ranges::begin(_M_base),
  1099. ranges::end(_M_base),
  1100. std::ref(*_M_pred));
  1101. _M_cached_begin._M_set(_M_base, __it);
  1102. return {this, std::move(__it)};
  1103. }
  1104. constexpr auto
  1105. end()
  1106. {
  1107. if constexpr (common_range<_Vp>)
  1108. return _Iterator{this, ranges::end(_M_base)};
  1109. else
  1110. return _Sentinel{this};
  1111. }
  1112. };
  1113. template<typename _Range, typename _Pred>
  1114. filter_view(_Range&&, _Pred) -> filter_view<views::all_t<_Range>, _Pred>;
  1115. namespace views
  1116. {
  1117. namespace __detail
  1118. {
  1119. template<typename _Range, typename _Pred>
  1120. concept __can_filter_view
  1121. = requires { filter_view{std::declval<_Range>(), std::declval<_Pred>()}; };
  1122. } // namespace __detail
  1123. struct _Filter : __adaptor::_RangeAdaptor<_Filter>
  1124. {
  1125. template<viewable_range _Range, typename _Pred>
  1126. requires __detail::__can_filter_view<_Range, _Pred>
  1127. constexpr auto
  1128. operator()(_Range&& __r, _Pred&& __p) const
  1129. {
  1130. return filter_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)};
  1131. }
  1132. using _RangeAdaptor<_Filter>::operator();
  1133. static constexpr int _S_arity = 2;
  1134. };
  1135. inline constexpr _Filter filter;
  1136. } // namespace views
  1137. template<input_range _Vp, copy_constructible _Fp>
  1138. requires view<_Vp> && is_object_v<_Fp>
  1139. && regular_invocable<_Fp&, range_reference_t<_Vp>>
  1140. && std::__detail::__can_reference<invoke_result_t<_Fp&,
  1141. range_reference_t<_Vp>>>
  1142. class transform_view : public view_interface<transform_view<_Vp, _Fp>>
  1143. {
  1144. private:
  1145. template<bool _Const>
  1146. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  1147. template<bool _Const>
  1148. struct __iter_cat
  1149. { };
  1150. template<bool _Const>
  1151. requires forward_range<_Base<_Const>>
  1152. struct __iter_cat<_Const>
  1153. {
  1154. private:
  1155. static auto
  1156. _S_iter_cat()
  1157. {
  1158. using _Base = transform_view::_Base<_Const>;
  1159. using _Res = invoke_result_t<_Fp&, range_reference_t<_Base>>;
  1160. if constexpr (is_lvalue_reference_v<_Res>)
  1161. {
  1162. using _Cat
  1163. = typename iterator_traits<iterator_t<_Base>>::iterator_category;
  1164. if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
  1165. return random_access_iterator_tag{};
  1166. else
  1167. return _Cat{};
  1168. }
  1169. else
  1170. return input_iterator_tag{};
  1171. }
  1172. public:
  1173. using iterator_category = decltype(_S_iter_cat());
  1174. };
  1175. template<bool _Const>
  1176. struct _Sentinel;
  1177. template<bool _Const>
  1178. struct _Iterator : __iter_cat<_Const>
  1179. {
  1180. private:
  1181. using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
  1182. using _Base = transform_view::_Base<_Const>;
  1183. static auto
  1184. _S_iter_concept()
  1185. {
  1186. if constexpr (random_access_range<_Vp>)
  1187. return random_access_iterator_tag{};
  1188. else if constexpr (bidirectional_range<_Vp>)
  1189. return bidirectional_iterator_tag{};
  1190. else if constexpr (forward_range<_Vp>)
  1191. return forward_iterator_tag{};
  1192. else
  1193. return input_iterator_tag{};
  1194. }
  1195. using _Base_iter = iterator_t<_Base>;
  1196. _Base_iter _M_current = _Base_iter();
  1197. _Parent* _M_parent = nullptr;
  1198. public:
  1199. using iterator_concept = decltype(_S_iter_concept());
  1200. // iterator_category defined in __transform_view_iter_cat
  1201. using value_type
  1202. = remove_cvref_t<invoke_result_t<_Fp&, range_reference_t<_Base>>>;
  1203. using difference_type = range_difference_t<_Base>;
  1204. _Iterator() = default;
  1205. constexpr
  1206. _Iterator(_Parent* __parent, _Base_iter __current)
  1207. : _M_current(std::move(__current)),
  1208. _M_parent(__parent)
  1209. { }
  1210. constexpr
  1211. _Iterator(_Iterator<!_Const> __i)
  1212. requires _Const
  1213. && convertible_to<iterator_t<_Vp>, _Base_iter>
  1214. : _M_current(std::move(__i._M_current)), _M_parent(__i._M_parent)
  1215. { }
  1216. constexpr _Base_iter
  1217. base() const &
  1218. requires copyable<_Base_iter>
  1219. { return _M_current; }
  1220. constexpr _Base_iter
  1221. base() &&
  1222. { return std::move(_M_current); }
  1223. constexpr decltype(auto)
  1224. operator*() const
  1225. noexcept(noexcept(std::__invoke(*_M_parent->_M_fun, *_M_current)))
  1226. { return std::__invoke(*_M_parent->_M_fun, *_M_current); }
  1227. constexpr _Iterator&
  1228. operator++()
  1229. {
  1230. ++_M_current;
  1231. return *this;
  1232. }
  1233. constexpr void
  1234. operator++(int)
  1235. { ++_M_current; }
  1236. constexpr _Iterator
  1237. operator++(int) requires forward_range<_Base>
  1238. {
  1239. auto __tmp = *this;
  1240. ++*this;
  1241. return __tmp;
  1242. }
  1243. constexpr _Iterator&
  1244. operator--() requires bidirectional_range<_Base>
  1245. {
  1246. --_M_current;
  1247. return *this;
  1248. }
  1249. constexpr _Iterator
  1250. operator--(int) requires bidirectional_range<_Base>
  1251. {
  1252. auto __tmp = *this;
  1253. --*this;
  1254. return __tmp;
  1255. }
  1256. constexpr _Iterator&
  1257. operator+=(difference_type __n) requires random_access_range<_Base>
  1258. {
  1259. _M_current += __n;
  1260. return *this;
  1261. }
  1262. constexpr _Iterator&
  1263. operator-=(difference_type __n) requires random_access_range<_Base>
  1264. {
  1265. _M_current -= __n;
  1266. return *this;
  1267. }
  1268. constexpr decltype(auto)
  1269. operator[](difference_type __n) const
  1270. requires random_access_range<_Base>
  1271. { return std::__invoke(*_M_parent->_M_fun, _M_current[__n]); }
  1272. friend constexpr bool
  1273. operator==(const _Iterator& __x, const _Iterator& __y)
  1274. requires equality_comparable<_Base_iter>
  1275. { return __x._M_current == __y._M_current; }
  1276. friend constexpr bool
  1277. operator<(const _Iterator& __x, const _Iterator& __y)
  1278. requires random_access_range<_Base>
  1279. { return __x._M_current < __y._M_current; }
  1280. friend constexpr bool
  1281. operator>(const _Iterator& __x, const _Iterator& __y)
  1282. requires random_access_range<_Base>
  1283. { return __y < __x; }
  1284. friend constexpr bool
  1285. operator<=(const _Iterator& __x, const _Iterator& __y)
  1286. requires random_access_range<_Base>
  1287. { return !(__y < __x); }
  1288. friend constexpr bool
  1289. operator>=(const _Iterator& __x, const _Iterator& __y)
  1290. requires random_access_range<_Base>
  1291. { return !(__x < __y); }
  1292. #ifdef __cpp_lib_three_way_comparison
  1293. friend constexpr auto
  1294. operator<=>(const _Iterator& __x, const _Iterator& __y)
  1295. requires random_access_range<_Base>
  1296. && three_way_comparable<_Base_iter>
  1297. { return __x._M_current <=> __y._M_current; }
  1298. #endif
  1299. friend constexpr _Iterator
  1300. operator+(_Iterator __i, difference_type __n)
  1301. requires random_access_range<_Base>
  1302. { return {__i._M_parent, __i._M_current + __n}; }
  1303. friend constexpr _Iterator
  1304. operator+(difference_type __n, _Iterator __i)
  1305. requires random_access_range<_Base>
  1306. { return {__i._M_parent, __i._M_current + __n}; }
  1307. friend constexpr _Iterator
  1308. operator-(_Iterator __i, difference_type __n)
  1309. requires random_access_range<_Base>
  1310. { return {__i._M_parent, __i._M_current - __n}; }
  1311. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  1312. // 3483. transform_view::iterator's difference is overconstrained
  1313. friend constexpr difference_type
  1314. operator-(const _Iterator& __x, const _Iterator& __y)
  1315. requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
  1316. { return __x._M_current - __y._M_current; }
  1317. friend constexpr decltype(auto)
  1318. iter_move(const _Iterator& __i) noexcept(noexcept(*__i))
  1319. {
  1320. if constexpr (is_lvalue_reference_v<decltype(*__i)>)
  1321. return std::move(*__i);
  1322. else
  1323. return *__i;
  1324. }
  1325. friend constexpr void
  1326. iter_swap(const _Iterator& __x, const _Iterator& __y)
  1327. noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current)))
  1328. requires indirectly_swappable<_Base_iter>
  1329. { return ranges::iter_swap(__x._M_current, __y._M_current); }
  1330. friend _Iterator<!_Const>;
  1331. template<bool> friend struct _Sentinel;
  1332. };
  1333. template<bool _Const>
  1334. struct _Sentinel
  1335. {
  1336. private:
  1337. using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
  1338. using _Base = transform_view::_Base<_Const>;
  1339. template<bool _Const2>
  1340. constexpr auto
  1341. __distance_from(const _Iterator<_Const2>& __i) const
  1342. { return _M_end - __i._M_current; }
  1343. template<bool _Const2>
  1344. constexpr bool
  1345. __equal(const _Iterator<_Const2>& __i) const
  1346. { return __i._M_current == _M_end; }
  1347. sentinel_t<_Base> _M_end = sentinel_t<_Base>();
  1348. public:
  1349. _Sentinel() = default;
  1350. constexpr explicit
  1351. _Sentinel(sentinel_t<_Base> __end)
  1352. : _M_end(__end)
  1353. { }
  1354. constexpr
  1355. _Sentinel(_Sentinel<!_Const> __i)
  1356. requires _Const
  1357. && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
  1358. : _M_end(std::move(__i._M_end))
  1359. { }
  1360. constexpr sentinel_t<_Base>
  1361. base() const
  1362. { return _M_end; }
  1363. template<bool _Const2>
  1364. requires sentinel_for<sentinel_t<_Base>,
  1365. iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
  1366. friend constexpr bool
  1367. operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
  1368. { return __y.__equal(__x); }
  1369. template<bool _Const2,
  1370. typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
  1371. requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  1372. friend constexpr range_difference_t<_Base2>
  1373. operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y)
  1374. { return -__y.__distance_from(__x); }
  1375. template<bool _Const2,
  1376. typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
  1377. requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  1378. friend constexpr range_difference_t<_Base2>
  1379. operator-(const _Sentinel& __y, const _Iterator<_Const2>& __x)
  1380. { return __y.__distance_from(__x); }
  1381. friend _Sentinel<!_Const>;
  1382. };
  1383. [[no_unique_address]] __detail::__box<_Fp> _M_fun;
  1384. _Vp _M_base = _Vp();
  1385. public:
  1386. transform_view() = default;
  1387. constexpr
  1388. transform_view(_Vp __base, _Fp __fun)
  1389. : _M_fun(std::move(__fun)), _M_base(std::move(__base))
  1390. { }
  1391. constexpr _Vp
  1392. base() const& requires copy_constructible<_Vp>
  1393. { return _M_base ; }
  1394. constexpr _Vp
  1395. base() &&
  1396. { return std::move(_M_base); }
  1397. constexpr _Iterator<false>
  1398. begin()
  1399. { return _Iterator<false>{this, ranges::begin(_M_base)}; }
  1400. constexpr _Iterator<true>
  1401. begin() const
  1402. requires range<const _Vp>
  1403. && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
  1404. { return _Iterator<true>{this, ranges::begin(_M_base)}; }
  1405. constexpr _Sentinel<false>
  1406. end()
  1407. { return _Sentinel<false>{ranges::end(_M_base)}; }
  1408. constexpr _Iterator<false>
  1409. end() requires common_range<_Vp>
  1410. { return _Iterator<false>{this, ranges::end(_M_base)}; }
  1411. constexpr _Sentinel<true>
  1412. end() const
  1413. requires range<const _Vp>
  1414. && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
  1415. { return _Sentinel<true>{ranges::end(_M_base)}; }
  1416. constexpr _Iterator<true>
  1417. end() const
  1418. requires common_range<const _Vp>
  1419. && regular_invocable<const _Fp&, range_reference_t<const _Vp>>
  1420. { return _Iterator<true>{this, ranges::end(_M_base)}; }
  1421. constexpr auto
  1422. size() requires sized_range<_Vp>
  1423. { return ranges::size(_M_base); }
  1424. constexpr auto
  1425. size() const requires sized_range<const _Vp>
  1426. { return ranges::size(_M_base); }
  1427. };
  1428. template<typename _Range, typename _Fp>
  1429. transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>;
  1430. namespace views
  1431. {
  1432. namespace __detail
  1433. {
  1434. template<typename _Range, typename _Fp>
  1435. concept __can_transform_view
  1436. = requires { transform_view{std::declval<_Range>(), std::declval<_Fp>()}; };
  1437. } // namespace __detail
  1438. struct _Transform : __adaptor::_RangeAdaptor<_Transform>
  1439. {
  1440. template<viewable_range _Range, typename _Fp>
  1441. requires __detail::__can_transform_view<_Range, _Fp>
  1442. constexpr auto
  1443. operator()(_Range&& __r, _Fp&& __f) const
  1444. {
  1445. return transform_view{std::forward<_Range>(__r), std::forward<_Fp>(__f)};
  1446. }
  1447. using _RangeAdaptor<_Transform>::operator();
  1448. static constexpr int _S_arity = 2;
  1449. };
  1450. inline constexpr _Transform transform;
  1451. } // namespace views
  1452. template<view _Vp>
  1453. class take_view : public view_interface<take_view<_Vp>>
  1454. {
  1455. private:
  1456. template<bool _Const>
  1457. using _CI = counted_iterator<
  1458. iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>;
  1459. template<bool _Const>
  1460. struct _Sentinel
  1461. {
  1462. private:
  1463. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  1464. sentinel_t<_Base> _M_end = sentinel_t<_Base>();
  1465. public:
  1466. _Sentinel() = default;
  1467. constexpr explicit
  1468. _Sentinel(sentinel_t<_Base> __end)
  1469. : _M_end(__end)
  1470. { }
  1471. constexpr
  1472. _Sentinel(_Sentinel<!_Const> __s)
  1473. requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
  1474. : _M_end(std::move(__s._M_end))
  1475. { }
  1476. constexpr sentinel_t<_Base>
  1477. base() const
  1478. { return _M_end; }
  1479. friend constexpr bool
  1480. operator==(const _CI<_Const>& __y, const _Sentinel& __x)
  1481. { return __y.count() == 0 || __y.base() == __x._M_end; }
  1482. template<bool _OtherConst = !_Const,
  1483. typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
  1484. requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  1485. friend constexpr bool
  1486. operator==(const _CI<_OtherConst>& __y, const _Sentinel& __x)
  1487. { return __y.count() == 0 || __y.base() == __x._M_end; }
  1488. friend _Sentinel<!_Const>;
  1489. };
  1490. range_difference_t<_Vp> _M_count = 0;
  1491. _Vp _M_base = _Vp();
  1492. public:
  1493. take_view() = default;
  1494. constexpr
  1495. take_view(_Vp base, range_difference_t<_Vp> __count)
  1496. : _M_count(std::move(__count)), _M_base(std::move(base))
  1497. { }
  1498. constexpr _Vp
  1499. base() const& requires copy_constructible<_Vp>
  1500. { return _M_base; }
  1501. constexpr _Vp
  1502. base() &&
  1503. { return std::move(_M_base); }
  1504. constexpr auto
  1505. begin() requires (!__detail::__simple_view<_Vp>)
  1506. {
  1507. if constexpr (sized_range<_Vp>)
  1508. {
  1509. if constexpr (random_access_range<_Vp>)
  1510. return ranges::begin(_M_base);
  1511. else
  1512. {
  1513. auto __sz = size();
  1514. return counted_iterator{ranges::begin(_M_base), __sz};
  1515. }
  1516. }
  1517. else
  1518. return counted_iterator{ranges::begin(_M_base), _M_count};
  1519. }
  1520. constexpr auto
  1521. begin() const requires range<const _Vp>
  1522. {
  1523. if constexpr (sized_range<const _Vp>)
  1524. {
  1525. if constexpr (random_access_range<const _Vp>)
  1526. return ranges::begin(_M_base);
  1527. else
  1528. {
  1529. auto __sz = size();
  1530. return counted_iterator{ranges::begin(_M_base), __sz};
  1531. }
  1532. }
  1533. else
  1534. return counted_iterator{ranges::begin(_M_base), _M_count};
  1535. }
  1536. constexpr auto
  1537. end() requires (!__detail::__simple_view<_Vp>)
  1538. {
  1539. if constexpr (sized_range<_Vp>)
  1540. {
  1541. if constexpr (random_access_range<_Vp>)
  1542. return ranges::begin(_M_base) + size();
  1543. else
  1544. return default_sentinel;
  1545. }
  1546. else
  1547. return _Sentinel<false>{ranges::end(_M_base)};
  1548. }
  1549. constexpr auto
  1550. end() const requires range<const _Vp>
  1551. {
  1552. if constexpr (sized_range<const _Vp>)
  1553. {
  1554. if constexpr (random_access_range<const _Vp>)
  1555. return ranges::begin(_M_base) + size();
  1556. else
  1557. return default_sentinel;
  1558. }
  1559. else
  1560. return _Sentinel<true>{ranges::end(_M_base)};
  1561. }
  1562. constexpr auto
  1563. size() requires sized_range<_Vp>
  1564. {
  1565. auto __n = ranges::size(_M_base);
  1566. return std::min(__n, static_cast<decltype(__n)>(_M_count));
  1567. }
  1568. constexpr auto
  1569. size() const requires sized_range<const _Vp>
  1570. {
  1571. auto __n = ranges::size(_M_base);
  1572. return std::min(__n, static_cast<decltype(__n)>(_M_count));
  1573. }
  1574. };
  1575. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  1576. // 3447. Deduction guides for take_view and drop_view have different
  1577. // constraints
  1578. template<typename _Range>
  1579. take_view(_Range&&, range_difference_t<_Range>)
  1580. -> take_view<views::all_t<_Range>>;
  1581. template<typename _Tp>
  1582. inline constexpr bool enable_borrowed_range<take_view<_Tp>>
  1583. = enable_borrowed_range<_Tp>;
  1584. namespace views
  1585. {
  1586. namespace __detail
  1587. {
  1588. template<typename _Range, typename _Tp>
  1589. concept __can_take_view
  1590. = requires { take_view{std::declval<_Range>(), std::declval<_Tp>()}; };
  1591. } // namespace __detail
  1592. struct _Take : __adaptor::_RangeAdaptor<_Take>
  1593. {
  1594. template<viewable_range _Range, typename _Tp>
  1595. requires __detail::__can_take_view<_Range, _Tp>
  1596. constexpr auto
  1597. operator()(_Range&& __r, _Tp&& __n) const
  1598. {
  1599. return take_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)};
  1600. }
  1601. using _RangeAdaptor<_Take>::operator();
  1602. static constexpr int _S_arity = 2;
  1603. };
  1604. inline constexpr _Take take;
  1605. } // namespace views
  1606. template<view _Vp, typename _Pred>
  1607. requires input_range<_Vp> && is_object_v<_Pred>
  1608. && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
  1609. class take_while_view : public view_interface<take_while_view<_Vp, _Pred>>
  1610. {
  1611. template<bool _Const>
  1612. struct _Sentinel
  1613. {
  1614. private:
  1615. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  1616. sentinel_t<_Base> _M_end = sentinel_t<_Base>();
  1617. const _Pred* _M_pred = nullptr;
  1618. public:
  1619. _Sentinel() = default;
  1620. constexpr explicit
  1621. _Sentinel(sentinel_t<_Base> __end, const _Pred* __pred)
  1622. : _M_end(__end), _M_pred(__pred)
  1623. { }
  1624. constexpr
  1625. _Sentinel(_Sentinel<!_Const> __s)
  1626. requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
  1627. : _M_end(__s._M_end), _M_pred(__s._M_pred)
  1628. { }
  1629. constexpr sentinel_t<_Base>
  1630. base() const { return _M_end; }
  1631. friend constexpr bool
  1632. operator==(const iterator_t<_Base>& __x, const _Sentinel& __y)
  1633. { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
  1634. template<bool _OtherConst = !_Const,
  1635. typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>>
  1636. requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  1637. friend constexpr bool
  1638. operator==(const iterator_t<_Base2>& __x, const _Sentinel& __y)
  1639. { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); }
  1640. friend _Sentinel<!_Const>;
  1641. };
  1642. [[no_unique_address]] __detail::__box<_Pred> _M_pred;
  1643. _Vp _M_base = _Vp();
  1644. public:
  1645. take_while_view() = default;
  1646. constexpr
  1647. take_while_view(_Vp base, _Pred __pred)
  1648. : _M_pred(std::move(__pred)), _M_base(std::move(base))
  1649. { }
  1650. constexpr _Vp
  1651. base() const& requires copy_constructible<_Vp>
  1652. { return _M_base; }
  1653. constexpr _Vp
  1654. base() &&
  1655. { return std::move(_M_base); }
  1656. constexpr const _Pred&
  1657. pred() const
  1658. { return *_M_pred; }
  1659. constexpr auto
  1660. begin() requires (!__detail::__simple_view<_Vp>)
  1661. { return ranges::begin(_M_base); }
  1662. constexpr auto
  1663. begin() const requires range<const _Vp>
  1664. && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
  1665. { return ranges::begin(_M_base); }
  1666. constexpr auto
  1667. end() requires (!__detail::__simple_view<_Vp>)
  1668. { return _Sentinel<false>(ranges::end(_M_base),
  1669. std::__addressof(*_M_pred)); }
  1670. constexpr auto
  1671. end() const requires range<const _Vp>
  1672. && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
  1673. { return _Sentinel<true>(ranges::end(_M_base),
  1674. std::__addressof(*_M_pred)); }
  1675. };
  1676. template<typename _Range, typename _Pred>
  1677. take_while_view(_Range&&, _Pred)
  1678. -> take_while_view<views::all_t<_Range>, _Pred>;
  1679. namespace views
  1680. {
  1681. namespace __detail
  1682. {
  1683. template<typename _Range, typename _Pred>
  1684. concept __can_take_while_view
  1685. = requires { take_while_view{std::declval<_Range>(), std::declval<_Pred>()}; };
  1686. } // namespace __detail
  1687. struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile>
  1688. {
  1689. template<viewable_range _Range, typename _Pred>
  1690. requires __detail::__can_take_while_view<_Range, _Pred>
  1691. constexpr auto
  1692. operator()(_Range&& __r, _Pred&& __p) const
  1693. {
  1694. return take_while_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)};
  1695. }
  1696. using _RangeAdaptor<_TakeWhile>::operator();
  1697. static constexpr int _S_arity = 2;
  1698. };
  1699. inline constexpr _TakeWhile take_while;
  1700. } // namespace views
  1701. template<view _Vp>
  1702. class drop_view : public view_interface<drop_view<_Vp>>
  1703. {
  1704. private:
  1705. range_difference_t<_Vp> _M_count = 0;
  1706. _Vp _M_base = _Vp();
  1707. // ranges::next(begin(base), count, end(base)) is O(1) if _Vp satisfies
  1708. // both random_access_range and sized_range. Otherwise, cache its result.
  1709. static constexpr bool _S_needs_cached_begin
  1710. = !(random_access_range<const _Vp> && sized_range<const _Vp>);
  1711. [[no_unique_address]]
  1712. __detail::__maybe_present_t<_S_needs_cached_begin,
  1713. __detail::_CachedPosition<_Vp>>
  1714. _M_cached_begin;
  1715. public:
  1716. drop_view() = default;
  1717. constexpr
  1718. drop_view(_Vp __base, range_difference_t<_Vp> __count)
  1719. : _M_count(__count), _M_base(std::move(__base))
  1720. { __glibcxx_assert(__count >= 0); }
  1721. constexpr _Vp
  1722. base() const& requires copy_constructible<_Vp>
  1723. { return _M_base; }
  1724. constexpr _Vp
  1725. base() &&
  1726. { return std::move(_M_base); }
  1727. // This overload is disabled for simple views with constant-time begin().
  1728. constexpr auto
  1729. begin()
  1730. requires (!(__detail::__simple_view<_Vp>
  1731. && random_access_range<const _Vp>
  1732. && sized_range<const _Vp>))
  1733. {
  1734. if constexpr (_S_needs_cached_begin)
  1735. if (_M_cached_begin._M_has_value())
  1736. return _M_cached_begin._M_get(_M_base);
  1737. auto __it = ranges::next(ranges::begin(_M_base),
  1738. _M_count, ranges::end(_M_base));
  1739. if constexpr (_S_needs_cached_begin)
  1740. _M_cached_begin._M_set(_M_base, __it);
  1741. return __it;
  1742. }
  1743. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  1744. // 3482. drop_view's const begin should additionally require sized_range
  1745. constexpr auto
  1746. begin() const
  1747. requires random_access_range<const _Vp> && sized_range<const _Vp>
  1748. {
  1749. return ranges::next(ranges::begin(_M_base), _M_count,
  1750. ranges::end(_M_base));
  1751. }
  1752. constexpr auto
  1753. end() requires (!__detail::__simple_view<_Vp>)
  1754. { return ranges::end(_M_base); }
  1755. constexpr auto
  1756. end() const requires range<const _Vp>
  1757. { return ranges::end(_M_base); }
  1758. constexpr auto
  1759. size() requires sized_range<_Vp>
  1760. {
  1761. const auto __s = ranges::size(_M_base);
  1762. const auto __c = static_cast<decltype(__s)>(_M_count);
  1763. return __s < __c ? 0 : __s - __c;
  1764. }
  1765. constexpr auto
  1766. size() const requires sized_range<const _Vp>
  1767. {
  1768. const auto __s = ranges::size(_M_base);
  1769. const auto __c = static_cast<decltype(__s)>(_M_count);
  1770. return __s < __c ? 0 : __s - __c;
  1771. }
  1772. };
  1773. template<typename _Range>
  1774. drop_view(_Range&&, range_difference_t<_Range>)
  1775. -> drop_view<views::all_t<_Range>>;
  1776. template<typename _Tp>
  1777. inline constexpr bool enable_borrowed_range<drop_view<_Tp>>
  1778. = enable_borrowed_range<_Tp>;
  1779. namespace views
  1780. {
  1781. namespace __detail
  1782. {
  1783. template<typename _Range, typename _Tp>
  1784. concept __can_drop_view
  1785. = requires { drop_view{std::declval<_Range>(), std::declval<_Tp>()}; };
  1786. } // namespace __detail
  1787. struct _Drop : __adaptor::_RangeAdaptor<_Drop>
  1788. {
  1789. template<viewable_range _Range, typename _Tp>
  1790. requires __detail::__can_drop_view<_Range, _Tp>
  1791. constexpr auto
  1792. operator()(_Range&& __r, _Tp&& __n) const
  1793. {
  1794. return drop_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)};
  1795. }
  1796. using _RangeAdaptor<_Drop>::operator();
  1797. static constexpr int _S_arity = 2;
  1798. };
  1799. inline constexpr _Drop drop;
  1800. } // namespace views
  1801. template<view _Vp, typename _Pred>
  1802. requires input_range<_Vp> && is_object_v<_Pred>
  1803. && indirect_unary_predicate<const _Pred, iterator_t<_Vp>>
  1804. class drop_while_view : public view_interface<drop_while_view<_Vp, _Pred>>
  1805. {
  1806. private:
  1807. [[no_unique_address]] __detail::__box<_Pred> _M_pred;
  1808. [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin;
  1809. _Vp _M_base = _Vp();
  1810. public:
  1811. drop_while_view() = default;
  1812. constexpr
  1813. drop_while_view(_Vp __base, _Pred __pred)
  1814. : _M_pred(std::move(__pred)), _M_base(std::move(__base))
  1815. { }
  1816. constexpr _Vp
  1817. base() const& requires copy_constructible<_Vp>
  1818. { return _M_base; }
  1819. constexpr _Vp
  1820. base() &&
  1821. { return std::move(_M_base); }
  1822. constexpr const _Pred&
  1823. pred() const
  1824. { return *_M_pred; }
  1825. constexpr auto
  1826. begin()
  1827. {
  1828. if (_M_cached_begin._M_has_value())
  1829. return _M_cached_begin._M_get(_M_base);
  1830. auto __it = __detail::find_if_not(ranges::begin(_M_base),
  1831. ranges::end(_M_base),
  1832. std::cref(*_M_pred));
  1833. _M_cached_begin._M_set(_M_base, __it);
  1834. return __it;
  1835. }
  1836. constexpr auto
  1837. end()
  1838. { return ranges::end(_M_base); }
  1839. };
  1840. template<typename _Range, typename _Pred>
  1841. drop_while_view(_Range&&, _Pred)
  1842. -> drop_while_view<views::all_t<_Range>, _Pred>;
  1843. template<typename _Tp, typename _Pred>
  1844. inline constexpr bool enable_borrowed_range<drop_while_view<_Tp, _Pred>>
  1845. = enable_borrowed_range<_Tp>;
  1846. namespace views
  1847. {
  1848. namespace __detail
  1849. {
  1850. template<typename _Range, typename _Pred>
  1851. concept __can_drop_while_view
  1852. = requires { drop_while_view{std::declval<_Range>(), std::declval<_Pred>()}; };
  1853. } // namespace __detail
  1854. struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile>
  1855. {
  1856. template<viewable_range _Range, typename _Pred>
  1857. requires __detail::__can_drop_while_view<_Range, _Pred>
  1858. constexpr auto
  1859. operator()(_Range&& __r, _Pred&& __p) const
  1860. {
  1861. return drop_while_view{std::forward<_Range>(__r),
  1862. std::forward<_Pred>(__p)};
  1863. }
  1864. using _RangeAdaptor<_DropWhile>::operator();
  1865. static constexpr int _S_arity = 2;
  1866. };
  1867. inline constexpr _DropWhile drop_while;
  1868. } // namespace views
  1869. template<input_range _Vp>
  1870. requires view<_Vp> && input_range<range_reference_t<_Vp>>
  1871. && (is_reference_v<range_reference_t<_Vp>>
  1872. || view<range_value_t<_Vp>>)
  1873. class join_view : public view_interface<join_view<_Vp>>
  1874. {
  1875. private:
  1876. using _InnerRange = range_reference_t<_Vp>;
  1877. template<bool _Const>
  1878. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  1879. template<bool _Const>
  1880. using _Outer_iter = iterator_t<_Base<_Const>>;
  1881. template<bool _Const>
  1882. using _Inner_iter = iterator_t<range_reference_t<_Base<_Const>>>;
  1883. template<bool _Const>
  1884. static constexpr bool _S_ref_is_glvalue
  1885. = is_reference_v<range_reference_t<_Base<_Const>>>;
  1886. template<bool _Const>
  1887. struct __iter_cat
  1888. { };
  1889. template<bool _Const>
  1890. requires _S_ref_is_glvalue<_Const>
  1891. && forward_range<_Base<_Const>>
  1892. && forward_range<range_reference_t<_Base<_Const>>>
  1893. struct __iter_cat<_Const>
  1894. {
  1895. private:
  1896. static constexpr auto
  1897. _S_iter_cat()
  1898. {
  1899. using _Outer_iter = join_view::_Outer_iter<_Const>;
  1900. using _Inner_iter = join_view::_Inner_iter<_Const>;
  1901. using _OuterCat = typename iterator_traits<_Outer_iter>::iterator_category;
  1902. using _InnerCat = typename iterator_traits<_Inner_iter>::iterator_category;
  1903. if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
  1904. && derived_from<_InnerCat, bidirectional_iterator_tag>)
  1905. return bidirectional_iterator_tag{};
  1906. else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
  1907. && derived_from<_InnerCat, forward_iterator_tag>)
  1908. return forward_iterator_tag{};
  1909. else
  1910. return input_iterator_tag{};
  1911. }
  1912. public:
  1913. using iterator_category = decltype(_S_iter_cat());
  1914. };
  1915. template<bool _Const>
  1916. struct _Sentinel;
  1917. template<bool _Const>
  1918. struct _Iterator : __iter_cat<_Const>
  1919. {
  1920. private:
  1921. using _Parent = __detail::__maybe_const_t<_Const, join_view>;
  1922. using _Base = join_view::_Base<_Const>;
  1923. static constexpr bool _S_ref_is_glvalue
  1924. = join_view::_S_ref_is_glvalue<_Const>;
  1925. constexpr void
  1926. _M_satisfy()
  1927. {
  1928. auto __update_inner = [this] (range_reference_t<_Base> __x) -> auto&
  1929. {
  1930. if constexpr (_S_ref_is_glvalue)
  1931. return __x;
  1932. else
  1933. return (_M_parent->_M_inner = views::all(std::move(__x)));
  1934. };
  1935. for (; _M_outer != ranges::end(_M_parent->_M_base); ++_M_outer)
  1936. {
  1937. auto& __inner = __update_inner(*_M_outer);
  1938. _M_inner = ranges::begin(__inner);
  1939. if (_M_inner != ranges::end(__inner))
  1940. return;
  1941. }
  1942. if constexpr (_S_ref_is_glvalue)
  1943. _M_inner = _Inner_iter();
  1944. }
  1945. static constexpr auto
  1946. _S_iter_concept()
  1947. {
  1948. if constexpr (_S_ref_is_glvalue
  1949. && bidirectional_range<_Base>
  1950. && bidirectional_range<range_reference_t<_Base>>)
  1951. return bidirectional_iterator_tag{};
  1952. else if constexpr (_S_ref_is_glvalue
  1953. && forward_range<_Base>
  1954. && forward_range<range_reference_t<_Base>>)
  1955. return forward_iterator_tag{};
  1956. else
  1957. return input_iterator_tag{};
  1958. }
  1959. using _Outer_iter = join_view::_Outer_iter<_Const>;
  1960. using _Inner_iter = join_view::_Inner_iter<_Const>;
  1961. _Outer_iter _M_outer = _Outer_iter();
  1962. _Inner_iter _M_inner = _Inner_iter();
  1963. _Parent* _M_parent = nullptr;
  1964. public:
  1965. using iterator_concept = decltype(_S_iter_concept());
  1966. // iterator_category defined in __join_view_iter_cat
  1967. using value_type = range_value_t<range_reference_t<_Base>>;
  1968. using difference_type
  1969. = common_type_t<range_difference_t<_Base>,
  1970. range_difference_t<range_reference_t<_Base>>>;
  1971. _Iterator() = default;
  1972. constexpr
  1973. _Iterator(_Parent* __parent, _Outer_iter __outer)
  1974. : _M_outer(std::move(__outer)),
  1975. _M_parent(__parent)
  1976. { _M_satisfy(); }
  1977. constexpr
  1978. _Iterator(_Iterator<!_Const> __i)
  1979. requires _Const
  1980. && convertible_to<iterator_t<_Vp>, _Outer_iter>
  1981. && convertible_to<iterator_t<_InnerRange>, _Inner_iter>
  1982. : _M_outer(std::move(__i._M_outer)), _M_inner(__i._M_inner),
  1983. _M_parent(__i._M_parent)
  1984. { }
  1985. constexpr decltype(auto)
  1986. operator*() const
  1987. { return *_M_inner; }
  1988. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  1989. // 3500. join_view::iterator::operator->() is bogus
  1990. constexpr _Inner_iter
  1991. operator->() const
  1992. requires __detail::__has_arrow<_Inner_iter>
  1993. && copyable<_Inner_iter>
  1994. { return _M_inner; }
  1995. constexpr _Iterator&
  1996. operator++()
  1997. {
  1998. auto&& __inner_range = [this] () -> decltype(auto) {
  1999. if constexpr (_S_ref_is_glvalue)
  2000. return *_M_outer;
  2001. else
  2002. return _M_parent->_M_inner;
  2003. }();
  2004. if (++_M_inner == ranges::end(__inner_range))
  2005. {
  2006. ++_M_outer;
  2007. _M_satisfy();
  2008. }
  2009. return *this;
  2010. }
  2011. constexpr void
  2012. operator++(int)
  2013. { ++*this; }
  2014. constexpr _Iterator
  2015. operator++(int)
  2016. requires _S_ref_is_glvalue && forward_range<_Base>
  2017. && forward_range<range_reference_t<_Base>>
  2018. {
  2019. auto __tmp = *this;
  2020. ++*this;
  2021. return __tmp;
  2022. }
  2023. constexpr _Iterator&
  2024. operator--()
  2025. requires _S_ref_is_glvalue && bidirectional_range<_Base>
  2026. && bidirectional_range<range_reference_t<_Base>>
  2027. && common_range<range_reference_t<_Base>>
  2028. {
  2029. if (_M_outer == ranges::end(_M_parent->_M_base))
  2030. _M_inner = ranges::end(*--_M_outer);
  2031. while (_M_inner == ranges::begin(*_M_outer))
  2032. _M_inner = ranges::end(*--_M_outer);
  2033. --_M_inner;
  2034. return *this;
  2035. }
  2036. constexpr _Iterator
  2037. operator--(int)
  2038. requires _S_ref_is_glvalue && bidirectional_range<_Base>
  2039. && bidirectional_range<range_reference_t<_Base>>
  2040. && common_range<range_reference_t<_Base>>
  2041. {
  2042. auto __tmp = *this;
  2043. --*this;
  2044. return __tmp;
  2045. }
  2046. friend constexpr bool
  2047. operator==(const _Iterator& __x, const _Iterator& __y)
  2048. requires _S_ref_is_glvalue
  2049. && equality_comparable<_Outer_iter>
  2050. && equality_comparable<_Inner_iter>
  2051. {
  2052. return (__x._M_outer == __y._M_outer
  2053. && __x._M_inner == __y._M_inner);
  2054. }
  2055. friend constexpr decltype(auto)
  2056. iter_move(const _Iterator& __i)
  2057. noexcept(noexcept(ranges::iter_move(__i._M_inner)))
  2058. { return ranges::iter_move(__i._M_inner); }
  2059. friend constexpr void
  2060. iter_swap(const _Iterator& __x, const _Iterator& __y)
  2061. noexcept(noexcept(ranges::iter_swap(__x._M_inner, __y._M_inner)))
  2062. { return ranges::iter_swap(__x._M_inner, __y._M_inner); }
  2063. friend _Iterator<!_Const>;
  2064. template<bool> friend struct _Sentinel;
  2065. };
  2066. template<bool _Const>
  2067. struct _Sentinel
  2068. {
  2069. private:
  2070. using _Parent = __detail::__maybe_const_t<_Const, join_view>;
  2071. using _Base = join_view::_Base<_Const>;
  2072. template<bool _Const2>
  2073. constexpr bool
  2074. __equal(const _Iterator<_Const2>& __i) const
  2075. { return __i._M_outer == _M_end; }
  2076. sentinel_t<_Base> _M_end = sentinel_t<_Base>();
  2077. public:
  2078. _Sentinel() = default;
  2079. constexpr explicit
  2080. _Sentinel(_Parent* __parent)
  2081. : _M_end(ranges::end(__parent->_M_base))
  2082. { }
  2083. constexpr
  2084. _Sentinel(_Sentinel<!_Const> __s)
  2085. requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
  2086. : _M_end(std::move(__s._M_end))
  2087. { }
  2088. template<bool _Const2>
  2089. requires sentinel_for<sentinel_t<_Base>,
  2090. iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
  2091. friend constexpr bool
  2092. operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
  2093. { return __y.__equal(__x); }
  2094. friend _Sentinel<!_Const>;
  2095. };
  2096. // XXX: _M_inner is "present only when !is_reference_v<_InnerRange>"
  2097. [[no_unique_address]]
  2098. __detail::__maybe_present_t<!is_reference_v<_InnerRange>,
  2099. views::all_t<_InnerRange>> _M_inner;
  2100. _Vp _M_base = _Vp();
  2101. public:
  2102. join_view() = default;
  2103. constexpr explicit
  2104. join_view(_Vp __base)
  2105. : _M_base(std::move(__base))
  2106. { }
  2107. constexpr _Vp
  2108. base() const& requires copy_constructible<_Vp>
  2109. { return _M_base; }
  2110. constexpr _Vp
  2111. base() &&
  2112. { return std::move(_M_base); }
  2113. constexpr auto
  2114. begin()
  2115. {
  2116. constexpr bool __use_const
  2117. = (__detail::__simple_view<_Vp>
  2118. && is_reference_v<range_reference_t<_Vp>>);
  2119. return _Iterator<__use_const>{this, ranges::begin(_M_base)};
  2120. }
  2121. constexpr auto
  2122. begin() const
  2123. requires input_range<const _Vp>
  2124. && is_reference_v<range_reference_t<const _Vp>>
  2125. {
  2126. return _Iterator<true>{this, ranges::begin(_M_base)};
  2127. }
  2128. constexpr auto
  2129. end()
  2130. {
  2131. if constexpr (forward_range<_Vp> && is_reference_v<_InnerRange>
  2132. && forward_range<_InnerRange>
  2133. && common_range<_Vp> && common_range<_InnerRange>)
  2134. return _Iterator<__detail::__simple_view<_Vp>>{this,
  2135. ranges::end(_M_base)};
  2136. else
  2137. return _Sentinel<__detail::__simple_view<_Vp>>{this};
  2138. }
  2139. constexpr auto
  2140. end() const
  2141. requires input_range<const _Vp>
  2142. && is_reference_v<range_reference_t<const _Vp>>
  2143. {
  2144. if constexpr (forward_range<const _Vp>
  2145. && is_reference_v<range_reference_t<const _Vp>>
  2146. && forward_range<range_reference_t<const _Vp>>
  2147. && common_range<const _Vp>
  2148. && common_range<range_reference_t<const _Vp>>)
  2149. return _Iterator<true>{this, ranges::end(_M_base)};
  2150. else
  2151. return _Sentinel<true>{this};
  2152. }
  2153. };
  2154. template<typename _Range>
  2155. explicit join_view(_Range&&) -> join_view<views::all_t<_Range>>;
  2156. namespace views
  2157. {
  2158. namespace __detail
  2159. {
  2160. template<typename _Range>
  2161. concept __can_join_view
  2162. = requires { join_view<all_t<_Range>>{std::declval<_Range>()}; };
  2163. } // namespace __detail
  2164. struct _Join : __adaptor::_RangeAdaptorClosure
  2165. {
  2166. template<viewable_range _Range>
  2167. requires __detail::__can_join_view<_Range>
  2168. constexpr auto
  2169. operator()(_Range&& __r) const
  2170. {
  2171. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  2172. // 3474. Nesting join_views is broken because of CTAD
  2173. return join_view<all_t<_Range>>{std::forward<_Range>(__r)};
  2174. }
  2175. };
  2176. inline constexpr _Join join;
  2177. } // namespace views
  2178. namespace __detail
  2179. {
  2180. template<auto>
  2181. struct __require_constant;
  2182. template<typename _Range>
  2183. concept __tiny_range = sized_range<_Range>
  2184. && requires
  2185. { typename __require_constant<remove_reference_t<_Range>::size()>; }
  2186. && (remove_reference_t<_Range>::size() <= 1);
  2187. template<typename _Base>
  2188. struct __split_view_outer_iter_cat
  2189. { };
  2190. template<forward_range _Base>
  2191. struct __split_view_outer_iter_cat<_Base>
  2192. { using iterator_category = input_iterator_tag; };
  2193. template<typename _Base>
  2194. struct __split_view_inner_iter_cat
  2195. { };
  2196. template<forward_range _Base>
  2197. struct __split_view_inner_iter_cat<_Base>
  2198. {
  2199. private:
  2200. static constexpr auto
  2201. _S_iter_cat()
  2202. {
  2203. using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category;
  2204. if constexpr (derived_from<_Cat, forward_iterator_tag>)
  2205. return forward_iterator_tag{};
  2206. else
  2207. return _Cat{};
  2208. }
  2209. public:
  2210. using iterator_category = decltype(_S_iter_cat());
  2211. };
  2212. }
  2213. template<input_range _Vp, forward_range _Pattern>
  2214. requires view<_Vp> && view<_Pattern>
  2215. && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>,
  2216. ranges::equal_to>
  2217. && (forward_range<_Vp> || __detail::__tiny_range<_Pattern>)
  2218. class split_view : public view_interface<split_view<_Vp, _Pattern>>
  2219. {
  2220. private:
  2221. template<bool _Const>
  2222. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  2223. template<bool _Const>
  2224. struct _InnerIter;
  2225. template<bool _Const>
  2226. struct _OuterIter
  2227. : __detail::__split_view_outer_iter_cat<_Base<_Const>>
  2228. {
  2229. private:
  2230. using _Parent = __detail::__maybe_const_t<_Const, split_view>;
  2231. using _Base = split_view::_Base<_Const>;
  2232. constexpr bool
  2233. __at_end() const
  2234. { return __current() == ranges::end(_M_parent->_M_base); }
  2235. // [range.split.outer] p1
  2236. // Many of the following specifications refer to the notional member
  2237. // current of outer-iterator. current is equivalent to current_ if
  2238. // V models forward_range, and parent_->current_ otherwise.
  2239. constexpr auto&
  2240. __current() noexcept
  2241. {
  2242. if constexpr (forward_range<_Vp>)
  2243. return _M_current;
  2244. else
  2245. return _M_parent->_M_current;
  2246. }
  2247. constexpr auto&
  2248. __current() const noexcept
  2249. {
  2250. if constexpr (forward_range<_Vp>)
  2251. return _M_current;
  2252. else
  2253. return _M_parent->_M_current;
  2254. }
  2255. _Parent* _M_parent = nullptr;
  2256. // XXX: _M_current is present only if "V models forward_range"
  2257. [[no_unique_address]]
  2258. __detail::__maybe_present_t<forward_range<_Vp>,
  2259. iterator_t<_Base>> _M_current;
  2260. public:
  2261. using iterator_concept = conditional_t<forward_range<_Base>,
  2262. forward_iterator_tag,
  2263. input_iterator_tag>;
  2264. // iterator_category defined in __split_view_outer_iter_cat
  2265. using difference_type = range_difference_t<_Base>;
  2266. struct value_type : view_interface<value_type>
  2267. {
  2268. private:
  2269. _OuterIter _M_i = _OuterIter();
  2270. public:
  2271. value_type() = default;
  2272. constexpr explicit
  2273. value_type(_OuterIter __i)
  2274. : _M_i(std::move(__i))
  2275. { }
  2276. constexpr _InnerIter<_Const>
  2277. begin() const
  2278. requires copyable<_OuterIter>
  2279. { return _InnerIter<_Const>{_M_i}; }
  2280. constexpr _InnerIter<_Const>
  2281. begin()
  2282. requires (!copyable<_OuterIter>)
  2283. { return _InnerIter<_Const>{std::move(_M_i)}; }
  2284. constexpr default_sentinel_t
  2285. end() const
  2286. { return default_sentinel; }
  2287. };
  2288. _OuterIter() = default;
  2289. constexpr explicit
  2290. _OuterIter(_Parent* __parent) requires (!forward_range<_Base>)
  2291. : _M_parent(__parent)
  2292. { }
  2293. constexpr
  2294. _OuterIter(_Parent* __parent, iterator_t<_Base> __current)
  2295. requires forward_range<_Base>
  2296. : _M_parent(__parent),
  2297. _M_current(std::move(__current))
  2298. { }
  2299. constexpr
  2300. _OuterIter(_OuterIter<!_Const> __i)
  2301. requires _Const
  2302. && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
  2303. : _M_parent(__i._M_parent), _M_current(std::move(__i._M_current))
  2304. { }
  2305. constexpr value_type
  2306. operator*() const
  2307. { return value_type{*this}; }
  2308. constexpr _OuterIter&
  2309. operator++()
  2310. {
  2311. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  2312. // 3505. split_view::outer-iterator::operator++ misspecified
  2313. const auto __end = ranges::end(_M_parent->_M_base);
  2314. if (__current() == __end)
  2315. return *this;
  2316. const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern};
  2317. if (__pbegin == __pend)
  2318. ++__current();
  2319. else if constexpr (__detail::__tiny_range<_Pattern>)
  2320. {
  2321. __current() = __detail::find(std::move(__current()), __end,
  2322. *__pbegin);
  2323. if (__current() != __end)
  2324. ++__current();
  2325. }
  2326. else
  2327. do
  2328. {
  2329. auto [__b, __p]
  2330. = __detail::mismatch(__current(), __end, __pbegin, __pend);
  2331. if (__p == __pend)
  2332. {
  2333. __current() = __b;
  2334. break;
  2335. }
  2336. } while (++__current() != __end);
  2337. return *this;
  2338. }
  2339. constexpr decltype(auto)
  2340. operator++(int)
  2341. {
  2342. if constexpr (forward_range<_Base>)
  2343. {
  2344. auto __tmp = *this;
  2345. ++*this;
  2346. return __tmp;
  2347. }
  2348. else
  2349. ++*this;
  2350. }
  2351. friend constexpr bool
  2352. operator==(const _OuterIter& __x, const _OuterIter& __y)
  2353. requires forward_range<_Base>
  2354. { return __x._M_current == __y._M_current; }
  2355. friend constexpr bool
  2356. operator==(const _OuterIter& __x, default_sentinel_t)
  2357. { return __x.__at_end(); };
  2358. friend _OuterIter<!_Const>;
  2359. friend _InnerIter<_Const>;
  2360. };
  2361. template<bool _Const>
  2362. struct _InnerIter
  2363. : __detail::__split_view_inner_iter_cat<_Base<_Const>>
  2364. {
  2365. private:
  2366. using _Base = split_view::_Base<_Const>;
  2367. constexpr bool
  2368. __at_end() const
  2369. {
  2370. auto [__pcur, __pend] = subrange{_M_i._M_parent->_M_pattern};
  2371. auto __end = ranges::end(_M_i._M_parent->_M_base);
  2372. if constexpr (__detail::__tiny_range<_Pattern>)
  2373. {
  2374. const auto& __cur = _M_i_current();
  2375. if (__cur == __end)
  2376. return true;
  2377. if (__pcur == __pend)
  2378. return _M_incremented;
  2379. return *__cur == *__pcur;
  2380. }
  2381. else
  2382. {
  2383. auto __cur = _M_i_current();
  2384. if (__cur == __end)
  2385. return true;
  2386. if (__pcur == __pend)
  2387. return _M_incremented;
  2388. do
  2389. {
  2390. if (*__cur != *__pcur)
  2391. return false;
  2392. if (++__pcur == __pend)
  2393. return true;
  2394. } while (++__cur != __end);
  2395. return false;
  2396. }
  2397. }
  2398. constexpr auto&
  2399. _M_i_current() noexcept
  2400. { return _M_i.__current(); }
  2401. constexpr auto&
  2402. _M_i_current() const noexcept
  2403. { return _M_i.__current(); }
  2404. _OuterIter<_Const> _M_i = _OuterIter<_Const>();
  2405. bool _M_incremented = false;
  2406. public:
  2407. using iterator_concept
  2408. = typename _OuterIter<_Const>::iterator_concept;
  2409. // iterator_category defined in __split_view_inner_iter_cat
  2410. using value_type = range_value_t<_Base>;
  2411. using difference_type = range_difference_t<_Base>;
  2412. _InnerIter() = default;
  2413. constexpr explicit
  2414. _InnerIter(_OuterIter<_Const> __i)
  2415. : _M_i(std::move(__i))
  2416. { }
  2417. constexpr decltype(auto)
  2418. operator*() const
  2419. { return *_M_i_current(); }
  2420. constexpr _InnerIter&
  2421. operator++()
  2422. {
  2423. _M_incremented = true;
  2424. if constexpr (!forward_range<_Base>)
  2425. if constexpr (_Pattern::size() == 0)
  2426. return *this;
  2427. ++_M_i_current();
  2428. return *this;
  2429. }
  2430. constexpr decltype(auto)
  2431. operator++(int)
  2432. {
  2433. if constexpr (forward_range<_Vp>)
  2434. {
  2435. auto __tmp = *this;
  2436. ++*this;
  2437. return __tmp;
  2438. }
  2439. else
  2440. ++*this;
  2441. }
  2442. friend constexpr bool
  2443. operator==(const _InnerIter& __x, const _InnerIter& __y)
  2444. requires forward_range<_Base>
  2445. { return __x._M_i == __y._M_i; }
  2446. friend constexpr bool
  2447. operator==(const _InnerIter& __x, default_sentinel_t)
  2448. { return __x.__at_end(); }
  2449. friend constexpr decltype(auto)
  2450. iter_move(const _InnerIter& __i)
  2451. noexcept(noexcept(ranges::iter_move(__i._M_i_current())))
  2452. { return ranges::iter_move(__i._M_i_current()); }
  2453. friend constexpr void
  2454. iter_swap(const _InnerIter& __x, const _InnerIter& __y)
  2455. noexcept(noexcept(ranges::iter_swap(__x._M_i_current(),
  2456. __y._M_i_current())))
  2457. requires indirectly_swappable<iterator_t<_Base>>
  2458. { ranges::iter_swap(__x._M_i_current(), __y._M_i_current()); }
  2459. };
  2460. _Pattern _M_pattern = _Pattern();
  2461. // XXX: _M_current is "present only if !forward_range<V>"
  2462. [[no_unique_address]]
  2463. __detail::__maybe_present_t<!forward_range<_Vp>,
  2464. iterator_t<_Vp>> _M_current;
  2465. _Vp _M_base = _Vp();
  2466. public:
  2467. split_view() = default;
  2468. constexpr
  2469. split_view(_Vp __base, _Pattern __pattern)
  2470. : _M_pattern(std::move(__pattern)), _M_base(std::move(__base))
  2471. { }
  2472. template<input_range _Range>
  2473. requires constructible_from<_Vp, views::all_t<_Range>>
  2474. && constructible_from<_Pattern, single_view<range_value_t<_Range>>>
  2475. constexpr
  2476. split_view(_Range&& __r, range_value_t<_Range> __e)
  2477. : _M_pattern(std::move(__e)),
  2478. _M_base(views::all(std::forward<_Range>(__r)))
  2479. { }
  2480. constexpr _Vp
  2481. base() const& requires copy_constructible<_Vp>
  2482. { return _M_base; }
  2483. constexpr _Vp
  2484. base() &&
  2485. { return std::move(_M_base); }
  2486. constexpr auto
  2487. begin()
  2488. {
  2489. if constexpr (forward_range<_Vp>)
  2490. return _OuterIter<__detail::__simple_view<_Vp>>{
  2491. this, ranges::begin(_M_base)};
  2492. else
  2493. {
  2494. _M_current = ranges::begin(_M_base);
  2495. return _OuterIter<false>{this};
  2496. }
  2497. }
  2498. constexpr auto
  2499. begin() const requires forward_range<_Vp> && forward_range<const _Vp>
  2500. {
  2501. return _OuterIter<true>{this, ranges::begin(_M_base)};
  2502. }
  2503. constexpr auto
  2504. end() requires forward_range<_Vp> && common_range<_Vp>
  2505. {
  2506. return _OuterIter<__detail::__simple_view<_Vp>>{
  2507. this, ranges::end(_M_base)};
  2508. }
  2509. constexpr auto
  2510. end() const
  2511. {
  2512. if constexpr (forward_range<_Vp>
  2513. && forward_range<const _Vp>
  2514. && common_range<const _Vp>)
  2515. return _OuterIter<true>{this, ranges::end(_M_base)};
  2516. else
  2517. return default_sentinel;
  2518. }
  2519. };
  2520. template<typename _Range, typename _Pattern>
  2521. split_view(_Range&&, _Pattern&&)
  2522. -> split_view<views::all_t<_Range>, views::all_t<_Pattern>>;
  2523. template<input_range _Range>
  2524. split_view(_Range&&, range_value_t<_Range>)
  2525. -> split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>;
  2526. namespace views
  2527. {
  2528. namespace __detail
  2529. {
  2530. template<typename _Range, typename _Pattern>
  2531. concept __can_split_view
  2532. = requires { split_view{std::declval<_Range>(), std::declval<_Pattern>()}; };
  2533. } // namespace __detail
  2534. struct _Split : __adaptor::_RangeAdaptor<_Split>
  2535. {
  2536. template<viewable_range _Range, typename _Pattern>
  2537. requires __detail::__can_split_view<_Range, _Pattern>
  2538. constexpr auto
  2539. operator()(_Range&& __r, _Pattern&& __f) const
  2540. {
  2541. return split_view{std::forward<_Range>(__r), std::forward<_Pattern>(__f)};
  2542. }
  2543. using _RangeAdaptor<_Split>::operator();
  2544. static constexpr int _S_arity = 2;
  2545. };
  2546. inline constexpr _Split split;
  2547. } // namespace views
  2548. namespace views
  2549. {
  2550. struct _Counted
  2551. {
  2552. template<input_or_output_iterator _Iter>
  2553. constexpr auto
  2554. operator()(_Iter __i, iter_difference_t<_Iter> __n) const
  2555. {
  2556. if constexpr (random_access_iterator<_Iter>)
  2557. return subrange{__i, __i + __n};
  2558. else
  2559. return subrange{counted_iterator{std::move(__i), __n},
  2560. default_sentinel};
  2561. }
  2562. };
  2563. inline constexpr _Counted counted{};
  2564. } // namespace views
  2565. template<view _Vp>
  2566. requires (!common_range<_Vp>) && copyable<iterator_t<_Vp>>
  2567. class common_view : public view_interface<common_view<_Vp>>
  2568. {
  2569. private:
  2570. _Vp _M_base = _Vp();
  2571. public:
  2572. common_view() = default;
  2573. constexpr explicit
  2574. common_view(_Vp __r)
  2575. : _M_base(std::move(__r))
  2576. { }
  2577. /* XXX: LWG 3280 didn't remove this constructor, but I think it should?
  2578. template<viewable_range _Range>
  2579. requires (!common_range<_Range>)
  2580. && constructible_from<_Vp, views::all_t<_Range>>
  2581. constexpr explicit
  2582. common_view(_Range&& __r)
  2583. : _M_base(views::all(std::forward<_Range>(__r)))
  2584. { }
  2585. */
  2586. constexpr _Vp
  2587. base() const& requires copy_constructible<_Vp>
  2588. { return _M_base; }
  2589. constexpr _Vp
  2590. base() &&
  2591. { return std::move(_M_base); }
  2592. constexpr auto
  2593. begin()
  2594. {
  2595. if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
  2596. return ranges::begin(_M_base);
  2597. else
  2598. return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
  2599. (ranges::begin(_M_base));
  2600. }
  2601. constexpr auto
  2602. begin() const requires range<const _Vp>
  2603. {
  2604. if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
  2605. return ranges::begin(_M_base);
  2606. else
  2607. return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
  2608. (ranges::begin(_M_base));
  2609. }
  2610. constexpr auto
  2611. end()
  2612. {
  2613. if constexpr (random_access_range<_Vp> && sized_range<_Vp>)
  2614. return ranges::begin(_M_base) + ranges::size(_M_base);
  2615. else
  2616. return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>>
  2617. (ranges::end(_M_base));
  2618. }
  2619. constexpr auto
  2620. end() const requires range<const _Vp>
  2621. {
  2622. if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>)
  2623. return ranges::begin(_M_base) + ranges::size(_M_base);
  2624. else
  2625. return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>>
  2626. (ranges::end(_M_base));
  2627. }
  2628. constexpr auto
  2629. size() requires sized_range<_Vp>
  2630. { return ranges::size(_M_base); }
  2631. constexpr auto
  2632. size() const requires sized_range<const _Vp>
  2633. { return ranges::size(_M_base); }
  2634. };
  2635. template<typename _Range>
  2636. common_view(_Range&&) -> common_view<views::all_t<_Range>>;
  2637. template<typename _Tp>
  2638. inline constexpr bool enable_borrowed_range<common_view<_Tp>>
  2639. = enable_borrowed_range<_Tp>;
  2640. namespace views
  2641. {
  2642. namespace __detail
  2643. {
  2644. template<typename _Range>
  2645. concept __already_common = common_range<_Range>
  2646. && requires { views::all(std::declval<_Range>()); };
  2647. template<typename _Range>
  2648. concept __can_common_view
  2649. = requires { common_view{std::declval<_Range>()}; };
  2650. } // namespace __detail
  2651. struct _Common : __adaptor::_RangeAdaptorClosure
  2652. {
  2653. template<viewable_range _Range>
  2654. requires __detail::__already_common<_Range>
  2655. || __detail::__can_common_view<_Range>
  2656. constexpr auto
  2657. operator()(_Range&& __r) const
  2658. {
  2659. if constexpr (__detail::__already_common<_Range>)
  2660. return views::all(std::forward<_Range>(__r));
  2661. else
  2662. return common_view{std::forward<_Range>(__r)};
  2663. }
  2664. };
  2665. inline constexpr _Common common;
  2666. } // namespace views
  2667. template<view _Vp>
  2668. requires bidirectional_range<_Vp>
  2669. class reverse_view : public view_interface<reverse_view<_Vp>>
  2670. {
  2671. private:
  2672. static constexpr bool _S_needs_cached_begin
  2673. = !common_range<_Vp> && !random_access_range<_Vp>;
  2674. [[no_unique_address]]
  2675. __detail::__maybe_present_t<_S_needs_cached_begin,
  2676. __detail::_CachedPosition<_Vp>>
  2677. _M_cached_begin;
  2678. _Vp _M_base = _Vp();
  2679. public:
  2680. reverse_view() = default;
  2681. constexpr explicit
  2682. reverse_view(_Vp __r)
  2683. : _M_base(std::move(__r))
  2684. { }
  2685. constexpr _Vp
  2686. base() const& requires copy_constructible<_Vp>
  2687. { return _M_base; }
  2688. constexpr _Vp
  2689. base() &&
  2690. { return std::move(_M_base); }
  2691. constexpr reverse_iterator<iterator_t<_Vp>>
  2692. begin()
  2693. {
  2694. if constexpr (_S_needs_cached_begin)
  2695. if (_M_cached_begin._M_has_value())
  2696. return std::make_reverse_iterator(_M_cached_begin._M_get(_M_base));
  2697. auto __it = ranges::next(ranges::begin(_M_base), ranges::end(_M_base));
  2698. if constexpr (_S_needs_cached_begin)
  2699. _M_cached_begin._M_set(_M_base, __it);
  2700. return std::make_reverse_iterator(std::move(__it));
  2701. }
  2702. constexpr auto
  2703. begin() requires common_range<_Vp>
  2704. { return std::make_reverse_iterator(ranges::end(_M_base)); }
  2705. constexpr auto
  2706. begin() const requires common_range<const _Vp>
  2707. { return std::make_reverse_iterator(ranges::end(_M_base)); }
  2708. constexpr reverse_iterator<iterator_t<_Vp>>
  2709. end()
  2710. { return std::make_reverse_iterator(ranges::begin(_M_base)); }
  2711. constexpr auto
  2712. end() const requires common_range<const _Vp>
  2713. { return std::make_reverse_iterator(ranges::begin(_M_base)); }
  2714. constexpr auto
  2715. size() requires sized_range<_Vp>
  2716. { return ranges::size(_M_base); }
  2717. constexpr auto
  2718. size() const requires sized_range<const _Vp>
  2719. { return ranges::size(_M_base); }
  2720. };
  2721. template<typename _Range>
  2722. reverse_view(_Range&&) -> reverse_view<views::all_t<_Range>>;
  2723. template<typename _Tp>
  2724. inline constexpr bool enable_borrowed_range<reverse_view<_Tp>>
  2725. = enable_borrowed_range<_Tp>;
  2726. namespace views
  2727. {
  2728. namespace __detail
  2729. {
  2730. template<typename>
  2731. inline constexpr bool __is_reversible_subrange = false;
  2732. template<typename _Iter, subrange_kind _Kind>
  2733. inline constexpr bool
  2734. __is_reversible_subrange<subrange<reverse_iterator<_Iter>,
  2735. reverse_iterator<_Iter>,
  2736. _Kind>> = true;
  2737. template<typename>
  2738. inline constexpr bool __is_reverse_view = false;
  2739. template<typename _Vp>
  2740. inline constexpr bool __is_reverse_view<reverse_view<_Vp>> = true;
  2741. template<typename _Range>
  2742. concept __can_reverse_view
  2743. = requires { reverse_view{std::declval<_Range>()}; };
  2744. } // namespace __detail
  2745. struct _Reverse : __adaptor::_RangeAdaptorClosure
  2746. {
  2747. template<viewable_range _Range>
  2748. requires __detail::__is_reverse_view<remove_cvref_t<_Range>>
  2749. || __detail::__is_reversible_subrange<remove_cvref_t<_Range>>
  2750. || __detail::__can_reverse_view<_Range>
  2751. constexpr auto
  2752. operator()(_Range&& __r) const
  2753. {
  2754. using _Tp = remove_cvref_t<_Range>;
  2755. if constexpr (__detail::__is_reverse_view<_Tp>)
  2756. return std::forward<_Range>(__r).base();
  2757. else if constexpr (__detail::__is_reversible_subrange<_Tp>)
  2758. {
  2759. using _Iter = decltype(ranges::begin(__r).base());
  2760. if constexpr (sized_range<_Tp>)
  2761. return subrange<_Iter, _Iter, subrange_kind::sized>
  2762. {__r.end().base(), __r.begin().base(), __r.size()};
  2763. else
  2764. return subrange<_Iter, _Iter, subrange_kind::unsized>
  2765. {__r.end().base(), __r.begin().base()};
  2766. }
  2767. else
  2768. return reverse_view{std::forward<_Range>(__r)};
  2769. }
  2770. };
  2771. inline constexpr _Reverse reverse;
  2772. } // namespace views
  2773. namespace __detail
  2774. {
  2775. template<typename _Tp, size_t _Nm>
  2776. concept __has_tuple_element = requires(_Tp __t)
  2777. {
  2778. typename tuple_size<_Tp>::type;
  2779. requires _Nm < tuple_size_v<_Tp>;
  2780. typename tuple_element_t<_Nm, _Tp>;
  2781. { std::get<_Nm>(__t) }
  2782. -> convertible_to<const tuple_element_t<_Nm, _Tp>&>;
  2783. };
  2784. template<typename _Tp, size_t _Nm>
  2785. concept __returnable_element
  2786. = is_reference_v<_Tp> || move_constructible<tuple_element_t<_Nm, _Tp>>;
  2787. }
  2788. template<input_range _Vp, size_t _Nm>
  2789. requires view<_Vp>
  2790. && __detail::__has_tuple_element<range_value_t<_Vp>, _Nm>
  2791. && __detail::__has_tuple_element<remove_reference_t<range_reference_t<_Vp>>,
  2792. _Nm>
  2793. && __detail::__returnable_element<range_reference_t<_Vp>, _Nm>
  2794. class elements_view : public view_interface<elements_view<_Vp, _Nm>>
  2795. {
  2796. public:
  2797. elements_view() = default;
  2798. constexpr explicit
  2799. elements_view(_Vp base)
  2800. : _M_base(std::move(base))
  2801. { }
  2802. constexpr _Vp
  2803. base() const& requires copy_constructible<_Vp>
  2804. { return _M_base; }
  2805. constexpr _Vp
  2806. base() &&
  2807. { return std::move(_M_base); }
  2808. constexpr auto
  2809. begin() requires (!__detail::__simple_view<_Vp>)
  2810. { return _Iterator<false>(ranges::begin(_M_base)); }
  2811. constexpr auto
  2812. begin() const requires range<const _Vp>
  2813. { return _Iterator<true>(ranges::begin(_M_base)); }
  2814. constexpr auto
  2815. end() requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>)
  2816. { return _Sentinel<false>{ranges::end(_M_base)}; }
  2817. constexpr auto
  2818. end() requires (!__detail::__simple_view<_Vp> && common_range<_Vp>)
  2819. { return _Iterator<false>{ranges::end(_M_base)}; }
  2820. constexpr auto
  2821. end() const requires range<const _Vp>
  2822. { return _Sentinel<true>{ranges::end(_M_base)}; }
  2823. constexpr auto
  2824. end() const requires common_range<const _Vp>
  2825. { return _Iterator<true>{ranges::end(_M_base)}; }
  2826. constexpr auto
  2827. size() requires sized_range<_Vp>
  2828. { return ranges::size(_M_base); }
  2829. constexpr auto
  2830. size() const requires sized_range<const _Vp>
  2831. { return ranges::size(_M_base); }
  2832. private:
  2833. template<bool _Const>
  2834. using _Base = __detail::__maybe_const_t<_Const, _Vp>;
  2835. template<bool _Const>
  2836. struct __iter_cat
  2837. { };
  2838. template<bool _Const>
  2839. requires forward_range<_Base<_Const>>
  2840. struct __iter_cat<_Const>
  2841. {
  2842. private:
  2843. static auto _S_iter_cat()
  2844. {
  2845. using _Base = elements_view::_Base<_Const>;
  2846. using _Cat = iterator_traits<iterator_t<_Base>>::iterator_category;
  2847. using _Res = decltype((std::get<_Nm>(*std::declval<iterator_t<_Base>>())));
  2848. if constexpr (!is_lvalue_reference_v<_Res>)
  2849. return input_iterator_tag{};
  2850. else if constexpr (derived_from<_Cat, random_access_iterator_tag>)
  2851. return random_access_iterator_tag{};
  2852. else
  2853. return _Cat{};
  2854. }
  2855. public:
  2856. using iterator_category = decltype(_S_iter_cat());
  2857. };
  2858. template<bool _Const>
  2859. struct _Sentinel;
  2860. template<bool _Const>
  2861. struct _Iterator : __iter_cat<_Const>
  2862. {
  2863. private:
  2864. using _Base = elements_view::_Base<_Const>;
  2865. iterator_t<_Base> _M_current = iterator_t<_Base>();
  2866. static constexpr decltype(auto)
  2867. _S_get_element(const iterator_t<_Base>& __i)
  2868. {
  2869. if constexpr (is_reference_v<range_reference_t<_Base>>)
  2870. return std::get<_Nm>(*__i);
  2871. else
  2872. {
  2873. using _Et = remove_cv_t<tuple_element_t<_Nm, range_reference_t<_Base>>>;
  2874. return static_cast<_Et>(std::get<_Nm>(*__i));
  2875. }
  2876. }
  2877. static auto
  2878. _S_iter_concept()
  2879. {
  2880. if constexpr (random_access_range<_Vp>)
  2881. return random_access_iterator_tag{};
  2882. else if constexpr (bidirectional_range<_Vp>)
  2883. return bidirectional_iterator_tag{};
  2884. else if constexpr (forward_range<_Vp>)
  2885. return forward_iterator_tag{};
  2886. else
  2887. return input_iterator_tag{};
  2888. }
  2889. friend _Iterator<!_Const>;
  2890. public:
  2891. using iterator_concept = decltype(_S_iter_concept());
  2892. // iterator_category defined in elements_view::__iter_cat
  2893. using value_type
  2894. = remove_cvref_t<tuple_element_t<_Nm, range_value_t<_Base>>>;
  2895. using difference_type = range_difference_t<_Base>;
  2896. _Iterator() = default;
  2897. constexpr explicit
  2898. _Iterator(iterator_t<_Base> current)
  2899. : _M_current(std::move(current))
  2900. { }
  2901. constexpr
  2902. _Iterator(_Iterator<!_Const> i)
  2903. requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>>
  2904. : _M_current(std::move(i._M_current))
  2905. { }
  2906. constexpr iterator_t<_Base>
  2907. base() const&
  2908. requires copyable<iterator_t<_Base>>
  2909. { return _M_current; }
  2910. constexpr iterator_t<_Base>
  2911. base() &&
  2912. { return std::move(_M_current); }
  2913. constexpr decltype(auto)
  2914. operator*() const
  2915. { return _S_get_element(_M_current); }
  2916. constexpr _Iterator&
  2917. operator++()
  2918. {
  2919. ++_M_current;
  2920. return *this;
  2921. }
  2922. constexpr void
  2923. operator++(int)
  2924. { ++_M_current; }
  2925. constexpr _Iterator
  2926. operator++(int) requires forward_range<_Base>
  2927. {
  2928. auto __tmp = *this;
  2929. ++_M_current;
  2930. return __tmp;
  2931. }
  2932. constexpr _Iterator&
  2933. operator--() requires bidirectional_range<_Base>
  2934. {
  2935. --_M_current;
  2936. return *this;
  2937. }
  2938. constexpr _Iterator
  2939. operator--(int) requires bidirectional_range<_Base>
  2940. {
  2941. auto __tmp = *this;
  2942. --_M_current;
  2943. return __tmp;
  2944. }
  2945. constexpr _Iterator&
  2946. operator+=(difference_type __n)
  2947. requires random_access_range<_Base>
  2948. {
  2949. _M_current += __n;
  2950. return *this;
  2951. }
  2952. constexpr _Iterator&
  2953. operator-=(difference_type __n)
  2954. requires random_access_range<_Base>
  2955. {
  2956. _M_current -= __n;
  2957. return *this;
  2958. }
  2959. constexpr decltype(auto)
  2960. operator[](difference_type __n) const
  2961. requires random_access_range<_Base>
  2962. { return _S_get_element(_M_current + __n); }
  2963. friend constexpr bool
  2964. operator==(const _Iterator& __x, const _Iterator& __y)
  2965. requires equality_comparable<iterator_t<_Base>>
  2966. { return __x._M_current == __y._M_current; }
  2967. friend constexpr bool
  2968. operator<(const _Iterator& __x, const _Iterator& __y)
  2969. requires random_access_range<_Base>
  2970. { return __x._M_current < __y._M_current; }
  2971. friend constexpr bool
  2972. operator>(const _Iterator& __x, const _Iterator& __y)
  2973. requires random_access_range<_Base>
  2974. { return __y._M_current < __x._M_current; }
  2975. friend constexpr bool
  2976. operator<=(const _Iterator& __x, const _Iterator& __y)
  2977. requires random_access_range<_Base>
  2978. { return !(__y._M_current > __x._M_current); }
  2979. friend constexpr bool
  2980. operator>=(const _Iterator& __x, const _Iterator& __y)
  2981. requires random_access_range<_Base>
  2982. { return !(__x._M_current > __y._M_current); }
  2983. #ifdef __cpp_lib_three_way_comparison
  2984. friend constexpr auto
  2985. operator<=>(const _Iterator& __x, const _Iterator& __y)
  2986. requires random_access_range<_Base>
  2987. && three_way_comparable<iterator_t<_Base>>
  2988. { return __x._M_current <=> __y._M_current; }
  2989. #endif
  2990. friend constexpr _Iterator
  2991. operator+(const _Iterator& __x, difference_type __y)
  2992. requires random_access_range<_Base>
  2993. { return _Iterator{__x} += __y; }
  2994. friend constexpr _Iterator
  2995. operator+(difference_type __x, const _Iterator& __y)
  2996. requires random_access_range<_Base>
  2997. { return __y + __x; }
  2998. friend constexpr _Iterator
  2999. operator-(const _Iterator& __x, difference_type __y)
  3000. requires random_access_range<_Base>
  3001. { return _Iterator{__x} -= __y; }
  3002. // _GLIBCXX_RESOLVE_LIB_DEFECTS
  3003. // 3483. transform_view::iterator's difference is overconstrained
  3004. friend constexpr difference_type
  3005. operator-(const _Iterator& __x, const _Iterator& __y)
  3006. requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
  3007. { return __x._M_current - __y._M_current; }
  3008. friend _Sentinel<_Const>;
  3009. };
  3010. template<bool _Const>
  3011. struct _Sentinel
  3012. {
  3013. private:
  3014. constexpr bool
  3015. _M_equal(const _Iterator<_Const>& __x) const
  3016. { return __x._M_current == _M_end; }
  3017. using _Base = elements_view::_Base<_Const>;
  3018. sentinel_t<_Base> _M_end = sentinel_t<_Base>();
  3019. public:
  3020. _Sentinel() = default;
  3021. constexpr explicit
  3022. _Sentinel(sentinel_t<_Base> __end)
  3023. : _M_end(std::move(__end))
  3024. { }
  3025. constexpr
  3026. _Sentinel(_Sentinel<!_Const> __other)
  3027. requires _Const
  3028. && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>>
  3029. : _M_end(std::move(__other._M_end))
  3030. { }
  3031. constexpr sentinel_t<_Base>
  3032. base() const
  3033. { return _M_end; }
  3034. template<bool _Const2>
  3035. requires sentinel_for<sentinel_t<_Base>,
  3036. iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>>
  3037. friend constexpr bool
  3038. operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y)
  3039. { return __y._M_equal(__x); }
  3040. template<bool _Const2,
  3041. typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
  3042. requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  3043. friend constexpr range_difference_t<_Base2>
  3044. operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y)
  3045. { return __x._M_current - __y._M_end; }
  3046. template<bool _Const2,
  3047. typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>>
  3048. requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>>
  3049. friend constexpr range_difference_t<_Base>
  3050. operator-(const _Sentinel& __x, const _Iterator<_Const2>& __y)
  3051. { return __x._M_end - __y._M_current; }
  3052. friend _Sentinel<!_Const>;
  3053. };
  3054. _Vp _M_base = _Vp();
  3055. };
  3056. template<typename _Tp, size_t _Nm>
  3057. inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>>
  3058. = enable_borrowed_range<_Tp>;
  3059. template<typename _Range>
  3060. using keys_view = elements_view<views::all_t<_Range>, 0>;
  3061. template<typename _Range>
  3062. using values_view = elements_view<views::all_t<_Range>, 1>;
  3063. namespace views
  3064. {
  3065. namespace __detail
  3066. {
  3067. template<size_t _Nm, typename _Range>
  3068. concept __can_elements_view
  3069. = requires { elements_view<all_t<_Range>, _Nm>{std::declval<_Range>()}; };
  3070. } // namespace __detail
  3071. template<size_t _Nm>
  3072. struct _Elements : __adaptor::_RangeAdaptorClosure
  3073. {
  3074. template<viewable_range _Range>
  3075. requires __detail::__can_elements_view<_Nm, _Range>
  3076. constexpr auto
  3077. operator()(_Range&& __r) const
  3078. {
  3079. return elements_view<all_t<_Range>, _Nm>{std::forward<_Range>(__r)};
  3080. }
  3081. };
  3082. template<size_t _Nm>
  3083. inline constexpr _Elements<_Nm> elements;
  3084. inline constexpr auto keys = elements<0>;
  3085. inline constexpr auto values = elements<1>;
  3086. } // namespace views
  3087. } // namespace ranges
  3088. namespace views = ranges::views;
  3089. _GLIBCXX_END_NAMESPACE_VERSION
  3090. } // namespace
  3091. #endif // library concepts
  3092. #endif // C++2a
  3093. #endif /* _GLIBCXX_RANGES */