ranges 102 KB

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