ranges 95 KB

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