Файловый менеджер - Редактировать - /opt/alt/alt-nodejs20/root/usr/share/doc/alt-nodejs20-libicu-doc/utfiterator_8h_source.html
Назад
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.14"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>ICU 78.3: common/unicode/utfiterator.h Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/searchdata.js"></script> <script type="text/javascript" src="search/search.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td id="projectalign" style="padding-left: 0.5em;"> <div id="projectname">ICU 78.3  <span id="projectnumber">78.3</span> </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.14 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ var searchBox = new SearchBox("searchBox", "search",false,'Search'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menu.js"></script> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ $(function() { initMenu('',true,false,'search.php','Search'); $(document).ready(function() { init_search(); }); }); /* @license-end */</script> <div id="main-nav"></div> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> </div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <div id="nav-path" class="navpath"> <ul> <li class="navelem"><a class="el" href="dir_bdd9a5d540de89e9fe90efdfc6973a4f.html">common</a></li><li class="navelem"><a class="el" href="dir_f59c6450ff718ff1b085cfd1c36acbd7.html">unicode</a></li> </ul> </div> </div><!-- top --> <div class="header"> <div class="headertitle"> <div class="title">utfiterator.h</div> </div> </div><!--header--> <div class="contents"> <a href="utfiterator_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// © 2024 and later: Unicode, Inc. and others.</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// License & terms of use: https://www.unicode.org/copyright.html</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> </div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">// utfiterator.h</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// created: 2024aug12 Markus W. Scherer</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#ifndef __UTFITERATOR_H__</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#define __UTFITERATOR_H__</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="utypes_8h.html">unicode/utypes.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API || !defined(UTYPES_H)</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <iterator></span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#if defined(__cpp_lib_ranges)</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include <ranges></span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <string></span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <string_view></span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include <type_traits></span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="utf16_8h.html">unicode/utf16.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include "<a class="code" href="utf8_8h.html">unicode/utf8.h</a>"</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include "<a class="code" href="uversion_8h.html">unicode/uversion.h</a>"</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="preprocessor">#ifndef U_HIDE_DRAFT_API</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46"> 149</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a> {</div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0"> 157</a></span>  <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0">UTF_BEHAVIOR_NEGATIVE</a>,</div><div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d"> 159</a></span>  <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d">UTF_BEHAVIOR_FFFD</a>,</div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56"> 167</a></span>  <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56">UTF_BEHAVIOR_SURROGATE</a></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> } <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a>;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="keyword">namespace </span><a class="code" href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a> {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="keyword">namespace </span>prv {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION >= 20</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> </div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="keyword">using</span> <a class="code" href="utfiterator_8h.html#ac94512354a3c3757bd51504e17c42675">iter_value_t</a> = <span class="keyword">typename</span> std::iter_value_t<Iter>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="keyword">using</span> <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">iter_difference_t</a> = std::iter_difference_t<Iter>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> </div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#a603cf1c4c624736f3965c0dae31a5c79">forward_iterator</a> = std::forward_iterator<Iter>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#ae75399e99d2481183124f5f96b19b9e1">bidirectional_iterator</a> = std::bidirectional_iterator<Iter>;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">template</span><<span class="keyword">typename</span> Range></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#afb839c10d925301c6dad1daeb23be6d0">range</a> = std::ranges::range<Range>;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ac94512354a3c3757bd51504e17c42675"> 199</a></span> <span class="keyword">using</span> <a class="code" href="utfiterator_8h.html#ac94512354a3c3757bd51504e17c42675">iter_value_t</a> = <span class="keyword">typename</span> std::iterator_traits<Iter>::value_type;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> </div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b"> 203</a></span> <span class="keyword">using</span> <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">iter_difference_t</a> = <span class="keyword">typename</span> std::iterator_traits<Iter>::difference_type;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a603cf1c4c624736f3965c0dae31a5c79"> 207</a></span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#a603cf1c4c624736f3965c0dae31a5c79">forward_iterator</a> =</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  std::is_base_of_v<</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  std::forward_iterator_tag,</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keyword">typename</span> std::iterator_traits<Iter>::iterator_category>;</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iter></div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae75399e99d2481183124f5f96b19b9e1"> 214</a></span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#ae75399e99d2481183124f5f96b19b9e1">bidirectional_iterator</a> =</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  std::is_base_of_v<</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  std::bidirectional_iterator_tag,</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keyword">typename</span> std::iterator_traits<Iter>::iterator_category>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type.html"> 221</a></span> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type.html">range_type</a> : std::false_type {};</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> <span class="keyword">template</span><<span class="keyword">typename</span> Range></div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type_3_01Range_00_01std_1_1void__t_3_01decltypf5078535dbcf2fa34be202d612eb2ece.html"> 225</a></span> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type.html">range_type</a><</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  Range,</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  std::void_t<decltype(std::declval<Range>().begin()),</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  decltype(std::declval<Range>().end())>> : std::true_type {};</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> </div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="keyword">template</span><<span class="keyword">typename</span> Range></div><div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#afb839c10d925301c6dad1daeb23be6d0"> 232</a></span> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#afb839c10d925301c6dad1daeb23be6d0">range</a> = <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type.html">range_type<Range>::value</a>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> </div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view.html"> 237</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view.html">is_basic_string_view</a> : std::false_type {};</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> </div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... Args></div><div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view_3_01std_1_1basic__string__view_3_01Args_8_8_8_01_4_01_4.html"> 241</a></span> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view.html">is_basic_string_view</a><std::basic_string_view<Args...>> : std::true_type {};</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> </div><div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a5296d8e44f40e0d0971832c9897437cb"> 244</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> constexpr <span class="keywordtype">bool</span> <a class="code" href="utfiterator_8h.html#a5296d8e44f40e0d0971832c9897437cb">is_basic_string_view_v</a> = <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view.html">is_basic_string_view<T>::value</a>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> </div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keywordtype">bool</span> skipSurrogates></div><div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html"> 248</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> {</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ab7f61b32d221876c2a30c14033f43900"> 252</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ab7f61b32d221876c2a30c14033f43900">value_type</a> = CP32;</div><div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa70b84fe2b967f700dc87970d0a9d95e"> 254</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa70b84fe2b967f700dc87970d0a9d95e">reference</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ab7f61b32d221876c2a30c14033f43900">value_type</a>;</div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#af8278209cf3ab67425453d254e3e5e6e"> 256</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#af8278209cf3ab67425453d254e3e5e6e">pointer</a> = CP32 *;</div><div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a631f701995e513bdd405a53d69a7c5b2"> 258</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a631f701995e513bdd405a53d69a7c5b2">difference_type</a> = int32_t;</div><div class="line"><a name="l00260"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aca3cdb7073d0401cc80bfe1e1710919e"> 260</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aca3cdb7073d0401cc80bfe1e1710919e">iterator_category</a> = std::forward_iterator_tag;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div><div class="line"><a name="l00263"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#abaca95cc01fa7f8f557c30983d75dade"> 263</a></span>  <span class="keyword">inline</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#abaca95cc01fa7f8f557c30983d75dade">CodePointsIterator</a>(CP32 c) : c_(c) {}</div><div class="line"><a name="l00265"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a64f6da9ed7725cd46064a4a10279cd51"> 265</a></span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a64f6da9ed7725cd46064a4a10279cd51">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> c_ == other.c_; }</div><div class="line"><a name="l00267"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a7a3611aefc4ffc6aabb7dd127baff164"> 267</a></span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a7a3611aefc4ffc6aabb7dd127baff164">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a64f6da9ed7725cd46064a4a10279cd51">operator==</a>(other); }</div><div class="line"><a name="l00269"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa7246527f695058d8cd0b29a74d0e5ee"> 269</a></span>  <span class="keyword">inline</span> CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa7246527f695058d8cd0b29a74d0e5ee">operator*</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> c_; }</div><div class="line"><a name="l00271"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ac13c7af05f6d185903ad18ea669fdfb4"> 271</a></span>  <span class="keyword">inline</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ac13c7af05f6d185903ad18ea669fdfb4">operator++</a>() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  ++c_;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">if</span> (skipSurrogates && c_ == 0xd800) {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  c_ = 0xe000;</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ad13250ea35651622d55c192832b3fe68"> 279</a></span>  <span class="keyword">inline</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ad13250ea35651622d55c192832b3fe68">operator++</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">CodePointsIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  ++(*this);</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  }</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> </div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  CP32 c_;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> };</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> } <span class="comment">// namespace prv</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32></div><div class="line"><a name="l00302"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html"> 302</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html">AllCodePoints</a> {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a91420451bc04e2d51e228a982b7701ff"> 306</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a91420451bc04e2d51e228a982b7701ff">AllCodePoints</a>() {}</div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a1a65524403cc16fe608a5a70a84216ab"> 312</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a1a65524403cc16fe608a5a70a84216ab">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">prv::CodePointsIterator<CP32, false></a>(0); }</div><div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#afae16d4e58f0fb76a9a98cb43939ebca"> 317</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#afae16d4e58f0fb76a9a98cb43939ebca">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">prv::CodePointsIterator<CP32, false></a>(0x110000); }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> };</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> </div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32></div><div class="line"><a name="l00333"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html"> 333</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html">AllScalarValues</a> {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00337"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#adfbed7e57bd31f2fe76b21100fbf1a9c"> 337</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#adfbed7e57bd31f2fe76b21100fbf1a9c">AllScalarValues</a>() {}</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#a968bba6c052a579970d2d7938b4ef4d6"> 343</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#a968bba6c052a579970d2d7938b4ef4d6">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">prv::CodePointsIterator<CP32, true></a>(0); }</div><div class="line"><a name="l00348"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#ae4b896b78551bb1a937e3ac3acf5c279"> 348</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#ae4b896b78551bb1a937e3ac3acf5c279">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">prv::CodePointsIterator<CP32, true></a>(0x110000); }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> };</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l00367"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html"> 367</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a> {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keyword">using</span> Unit = <span class="keyword">typename</span> <a class="code" href="utfiterator_8h.html#ac94512354a3c3757bd51504e17c42675">prv::iter_value_t<UnitIter></a>;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de"> 372</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a>(CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>, UnitIter start, UnitIter limit) :</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  c_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>), len_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>), start_(start), limit_(limit) {}</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab2614effbec8d1c1ec64ae4ee40fa056">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00387"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde"> 387</a></span>  CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> c_; }</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div><div class="line"><a name="l00394"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5"> 394</a></span>  UnitIter <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> start_; }</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00401"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a"> 401</a></span>  UnitIter <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> limit_; }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div><div class="line"><a name="l00407"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135"> 407</a></span>  uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> len_; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION >= 20</span></div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span> </div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keyword">template</span><std::contiguous_iterator Iter = UnitIter></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  std::basic_string_view<Unit> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a126a1bacc34a290a079d2676031db019">stringView</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">return</span> std::basic_string_view<Unit>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>(), <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>());</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  }</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  template<typename Iter = UnitIter, typename Unit = typename std::iterator_traits<Iter>::value_type></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  std::enable_if_t<std::is_pointer_v<Iter> ||</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  std::is_same_v<Iter, typename std::basic_string<Unit>::iterator> ||</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  std::is_same_v<Iter, typename std::basic_string<Unit>::const_iterator> ||</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  std::is_same_v<Iter, typename std::basic_string_view<Unit>::iterator> ||</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  std::is_same_v<Iter, typename std::basic_string_view<Unit>::const_iterator>,</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  std::basic_string_view<Unit>></div><div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a126a1bacc34a290a079d2676031db019"> 432</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a126a1bacc34a290a079d2676031db019">stringView</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">return</span> std::basic_string_view<Unit>(&*start_, len_);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="comment">// Order of fields with padding and access frequency in mind.</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  CP32 c_;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  uint8_t len_;</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  UnitIter start_;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  UnitIter limit_;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> };</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> <span class="comment">// Partial template specialization for single-pass input iterator.</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="comment">// No UnitIter field, no getter for it, no stringView().</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> <span class="keyword">class </span>UnsafeCodeUnits<</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  CP32,</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  UnitIter,</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  std::enable_if_t<!prv::forward_iterator<UnitIter>>> {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a>(CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>) : c_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>), len_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>) {}</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab2614effbec8d1c1ec64ae4ee40fa056">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> c_; }</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> </div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> len_; }</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="comment">// Order of fields with padding and access frequency in mind.</span></div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  CP32 c_;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  uint8_t len_;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> };</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> </div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l00487"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html"> 487</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits</a> : <span class="keyword">public</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a><CP32, UnitIter> {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00490"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62"> 490</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a>(CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>, <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>, UnitIter start, UnitIter limit) :</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits</a><CP32, UnitIter>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>, start, limit), ok_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>) {}</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> </div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a3afb339a6b661fbf25dcef52c6fb1764">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span> </div><div class="line"><a name="l00502"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f"> 502</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ok_; }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span> </div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordtype">bool</span> ok_;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> };</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> </div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> <span class="comment">// Partial template specialization for single-pass input iterator.</span></div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> <span class="comment">// No UnitIter field, no getter for it, no stringView().</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="keyword">class </span>CodeUnits<</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  CP32,</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  UnitIter,</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  std::enable_if_t<!prv::forward_iterator<UnitIter>>> :</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keyword">public</span> UnsafeCodeUnits<CP32, UnitIter> {</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a>(CP32 <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, uint8_t <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>, <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>) :</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">UnsafeCodeUnits</a><CP32, UnitIter>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">codePoint</a>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">length</a>), ok_(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>) {}</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span> </div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a3afb339a6b661fbf25dcef52c6fb1764">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">CodeUnits</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">wellFormed</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> ok_; }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordtype">bool</span> ok_;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> };</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> <span class="comment">// Validating implementations ---------------------------------------------- ***</span></div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> </div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a> behavior,</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter = UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="keyword">class </span>UTFImpl;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="comment">// Note: readAndInc() functions take both a p0 and a p iterator.</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment">// They must have the same value.</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="comment">// For a multi-pass UnitIter, the caller must copy its p into a local variable p0,</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span> <span class="comment">// and readAndInc() copies p0 and the incremented p into the CodeUnits.</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> <span class="comment">// For a single-pass UnitIter, which may not be default-constructible nor coypable,</span></div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="comment">// the caller can pass p into both references, and readAndInc() does not use p0</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment">// and constructs CodeUnits without them.</span></div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="comment">// Moving the p0 variable into the call site avoids having to declare it inside readAndInc()</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> <span class="comment">// which may not be possible for a single-pass iterator.</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> <span class="comment">// UTF-8</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> <span class="keyword">class </span>UTFImpl<</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  CP32, behavior,</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  UnitIter, LimitIter,</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 1>> {</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  static_assert(behavior != <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56">UTF_BEHAVIOR_SURROGATE</a>,</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="stringliteral">"For 8-bit strings, the SURROGATE option does not have an equivalent."</span>);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="comment">// Handle ill-formed UTF-8</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CP32 sub() {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordflow">if</span> constexpr (behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0">UTF_BEHAVIOR_NEGATIVE</a>) {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">return</span> <a class="code" href="umachine_8h.html#a807436737b76a72b76ddf0b900304b4a">U_SENTINEL</a>;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  static_assert(behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d">UTF_BEHAVIOR_FFFD</a>);</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">return</span> 0xfffd;</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  }</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  }</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p, <span class="keyword">const</span> LimitIter &limit) {</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="comment">// Very similar to U8_FWD_1().</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  uint8_t b = *p;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  ++p;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#adb9837ea38dd811524a5b761ddc2a2ca">U8_IS_LEAD</a>(b) && p != limit) {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  uint8_t t1 = *p;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">if</span> ((0xe0 <= b && b < 0xf0)) {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a>(b, t1) &&</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  ++p != limit && <a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(*p)) {</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  ++p;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b < 0xe0) {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(t1)) {</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  ++p;</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  } <span class="keywordflow">else</span> <span class="comment">/* b >= 0xf0 */</span> {</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b, t1) &&</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  ++p != limit && <a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(*p) &&</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  ++p != limit && <a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(*p)) {</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  ++p;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  }</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  }</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  }</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span> </div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter start, UnitIter &p) {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="comment">// Very similar to U8_BACK_1().</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  uint8_t c = *--p;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(c) && p != start) {</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  UnitIter p1 = p;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  uint8_t b1 = *--p1;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#adb9837ea38dd811524a5b761ddc2a2ca">U8_IS_LEAD</a>(b1)) {</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordflow">if</span> (b1 < 0xe0 ||</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  (b1 < 0xf0 ?</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <a class="code" href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a>(b1, c) :</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b1, c))) {</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  p = p1;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(b1) && p1 != start) {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  uint8_t b2 = *--p1;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">if</span> (0xe0 <= b2 && b2 <= 0xf4) {</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keywordflow">if</span> (b2 < 0xf0 ?</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <a class="code" href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a>(b2, b1) :</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b2, b1)) {</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  p = p1;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  }</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(b2) && p1 != start) {</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  uint8_t b3 = *--p1;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keywordflow">if</span> (0xf0 <= b3 && b3 <= 0xf4 && <a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b3, b2)) {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  p = p1;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  }</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  }</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  }</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> </div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> readAndInc(</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  UnitIter &p0, UnitIter &p, <span class="keyword">const</span> LimitIter &limit) {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="comment">// Very similar to U8_NEXT_OR_FFFD().</span></div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  CP32 c = uint8_t(*p);</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  ++p;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a8f3a9427d880458a9fa6b169a3cc1b3c">U8_IS_SINGLE</a>(c)) {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p0, p};</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>};</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  }</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  uint8_t length = 1;</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  uint8_t t = 0;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordflow">if</span> (p != limit &&</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="comment">// fetch/validate/assemble all but last trail byte</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  (c >= 0xe0 ?</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  (c < 0xf0 ? <span class="comment">// U+0800..U+FFFF except surrogates</span></div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <a class="code" href="utf8_8h.html#aabfe8ee746b8025ec80ed1977e8ae3c6">U8_LEAD3_T1_BITS</a>[c &= 0xf] & (1 << ((t = *p) >> 5)) &&</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  (t &= 0x3f, 1)</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  : <span class="comment">// U+10000..U+10FFFF</span></div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  (c -= 0xf0) <= 4 &&</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <a class="code" href="utf8_8h.html#ab7b00ab82ca3e89d24c4088b2b4e9416">U8_LEAD4_T1_BITS</a>[(t = *p) >> 4] & (1 << c) &&</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  (c = (c << 6) | (t & 0x3f), ++length, ++p != limit) &&</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  (t = *p - 0x80) <= 0x3f) &&</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="comment">// valid second-to-last trail byte</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  (c = (c << 6) | t, ++length, ++p != limit)</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  : <span class="comment">// U+0080..U+07FF</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  c >= 0xc2 && (c &= 0x1f, 1)) &&</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="comment">// last trail byte</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  (t = *p - 0x80) <= 0x3f) {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  c = (c << 6) | t;</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  ++length;</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  ++p;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">return</span> {c, length, <span class="keyword">true</span>, p0, p};</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">return</span> {c, length, <span class="keyword">true</span>};</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">return</span> {sub(), length, <span class="keyword">false</span>, p0, p};</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordflow">return</span> {sub(), length, <span class="keyword">false</span>};</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  }</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  }</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span> </div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> decAndRead(UnitIter start, UnitIter &p) {</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="comment">// Very similar to U8_PREV_OR_FFFD().</span></div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  UnitIter p0 = p;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  CP32 c = uint8_t(*--p);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a8f3a9427d880458a9fa6b169a3cc1b3c">U8_IS_SINGLE</a>(c)) {</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  }</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(c) && p != start) {</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  UnitIter p1 = p;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  uint8_t b1 = *--p1;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#adb9837ea38dd811524a5b761ddc2a2ca">U8_IS_LEAD</a>(b1)) {</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">if</span> (b1 < 0xe0) {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  p = p1;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  c = ((b1 - 0xc0) << 6) | (c & 0x3f);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">return</span> {c, 2, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b1 < 0xf0 ?</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <a class="code" href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a>(b1, c) :</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b1, c)) {</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="comment">// Truncated 3- or 4-byte sequence.</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  p = p1;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <span class="keywordflow">return</span> {sub(), 2, <span class="keyword">false</span>, p, p0};</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  }</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(b1) && p1 != start) {</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="comment">// Extract the value bits from the last trail byte.</span></div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  c &= 0x3f;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  uint8_t b2 = *--p1;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordflow">if</span> (0xe0 <= b2 && b2 <= 0xf4) {</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordflow">if</span> (b2 < 0xf0) {</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  b2 &= 0xf;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a>(b2, b1)) {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  p = p1;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  c = (b2 << 12) | ((b1 & 0x3f) << 6) | c;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="keywordflow">return</span> {c, 3, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  }</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b2, b1)) {</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="comment">// Truncated 4-byte sequence.</span></div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  p = p1;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordflow">return</span> {sub(), 3, <span class="keyword">false</span>, p, p0};</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(b2) && p1 != start) {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  uint8_t b3 = *--p1;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">if</span> (0xf0 <= b3 && b3 <= 0xf4) {</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  b3 &= 7;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a>(b3, b2)) {</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  p = p1;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  c = (b3 << 18) | ((b2 & 0x3f) << 12) | ((b1 & 0x3f) << 6) | c;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keywordflow">return</span> {c, 4, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  }</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  }</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  }</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">return</span> {sub(), 1, <span class="keyword">false</span>, p, p0};</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  }</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> };</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> <span class="comment">// UTF-16</span></div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter></div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span> <span class="keyword">class </span>UTFImpl<</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  CP32, behavior,</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  UnitIter, LimitIter,</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 2>> {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="comment">// Handle ill-formed UTF-16: One unpaired surrogate.</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CP32 sub(CP32 surrogate) {</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">if</span> constexpr (behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0">UTF_BEHAVIOR_NEGATIVE</a>) {</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordflow">return</span> <a class="code" href="umachine_8h.html#a807436737b76a72b76ddf0b900304b4a">U_SENTINEL</a>;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr (behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d">UTF_BEHAVIOR_FFFD</a>) {</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <span class="keywordflow">return</span> 0xfffd;</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  static_assert(behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56">UTF_BEHAVIOR_SURROGATE</a>);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">return</span> surrogate;</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  }</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  }</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p, <span class="keyword">const</span> LimitIter &limit) {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="comment">// Very similar to U16_FWD_1().</span></div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keyword">auto</span> c = *p;</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  ++p;</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a>(c) && p != limit && <a class="code" href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a>(*p)) {</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  ++p;</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter start, UnitIter &p) {</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="comment">// Very similar to U16_BACK_1().</span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  UnitIter p1;</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a>(*--p) && p != start && (p1 = p, <a class="code" href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a>(*--p1))) {</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  p = p1;</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> </div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> readAndInc(</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  UnitIter &p0, UnitIter &p, <span class="keyword">const</span> LimitIter &limit) {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="comment">// Very similar to U16_NEXT_OR_FFFD().</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  CP32 c = <span class="keyword">static_cast<</span>CP32<span class="keyword">></span>(*p);</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  ++p;</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keywordflow">if</span> (!<a class="code" href="utf16_8h.html#ac25b589c0c9b60160d357770fad39cea">U16_IS_SURROGATE</a>(c)) {</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p0, p};</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>};</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  uint16_t c2;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#a6e141a548138e8c24822d219b7e06cb4">U16_IS_SURROGATE_LEAD</a>(c) && p != limit && <a class="code" href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a>(c2 = *p)) {</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  ++p;</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  c = <a class="code" href="utf16_8h.html#ac1deffbf1956d9fe696129515e88f006">U16_GET_SUPPLEMENTARY</a>(c, c2);</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="keywordflow">return</span> {c, 2, <span class="keyword">true</span>, p0, p};</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="keywordflow">return</span> {c, 2, <span class="keyword">true</span>};</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  }</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordflow">return</span> {sub(c), 1, <span class="keyword">false</span>, p0, p};</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keywordflow">return</span> {sub(c), 1, <span class="keyword">false</span>};</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  }</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  }</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  }</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  }</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span> </div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> decAndRead(UnitIter start, UnitIter &p) {</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="comment">// Very similar to U16_PREV_OR_FFFD().</span></div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  UnitIter p0 = p;</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  CP32 c = <span class="keyword">static_cast<</span>CP32<span class="keyword">></span>(*--p);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">if</span> (!<a class="code" href="utf16_8h.html#ac25b589c0c9b60160d357770fad39cea">U16_IS_SURROGATE</a>(c)) {</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  UnitIter p1;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  uint16_t c2;</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#a1da8c1409deafe3ac32a8ab506086c10">U16_IS_SURROGATE_TRAIL</a>(c) && p != start && (p1 = p, <a class="code" href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a>(c2 = *--p1))) {</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  p = p1;</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  c = <a class="code" href="utf16_8h.html#ac1deffbf1956d9fe696129515e88f006">U16_GET_SUPPLEMENTARY</a>(c2, c);</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keywordflow">return</span> {c, 2, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <span class="keywordflow">return</span> {sub(c), 1, <span class="keyword">false</span>, p, p0};</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  }</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  }</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  }</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> };</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span> </div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> <span class="comment">// UTF-32: trivial, but still validating</span></div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter></div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span> <span class="keyword">class </span>UTFImpl<</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  CP32, behavior,</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  UnitIter, LimitIter,</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 4>> {</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="comment">// Handle ill-formed UTF-32</span></div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CP32 sub(<span class="keywordtype">bool</span> forSurrogate, CP32 surrogate) {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordflow">if</span> constexpr (behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0">UTF_BEHAVIOR_NEGATIVE</a>) {</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="keywordflow">return</span> <a class="code" href="umachine_8h.html#a807436737b76a72b76ddf0b900304b4a">U_SENTINEL</a>;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr (behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d">UTF_BEHAVIOR_FFFD</a>) {</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="keywordflow">return</span> 0xfffd;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  static_assert(behavior == <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56">UTF_BEHAVIOR_SURROGATE</a>);</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  <span class="keywordflow">return</span> forSurrogate ? surrogate : 0xfffd;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  }</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> </div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p, <span class="keyword">const</span> LimitIter &<span class="comment">/*limit*/</span>) {</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  ++p;</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  }</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span> </div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter <span class="comment">/*start*/</span>, UnitIter &p) {</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  --p;</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  }</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> readAndInc(</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  UnitIter &p0, UnitIter &p, <span class="keyword">const</span> LimitIter &<span class="comment">/*limit*/</span>) {</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  uint32_t uc = *p;</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  CP32 c = uc;</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  ++p;</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keywordflow">if</span> (uc < 0xd800 || (0xe000 <= uc && uc <= 0x10ffff)) {</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p0, p};</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>};</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  }</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keywordflow">return</span> {sub(uc < 0xe000, c), 1, <span class="keyword">false</span>, p0, p};</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordflow">return</span> {sub(uc < 0xe000, c), 1, <span class="keyword">false</span>};</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  }</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  }</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> </div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> CodeUnits<CP32, UnitIter> decAndRead(UnitIter <span class="comment">/*start*/</span>, UnitIter &p) {</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  UnitIter p0 = p;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  uint32_t uc = *--p;</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  CP32 c = uc;</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">if</span> (uc < 0xd800 || (0xe000 <= uc && uc <= 0x10ffff)) {</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="keywordflow">return</span> {c, 1, <span class="keyword">true</span>, p, p0};</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordflow">return</span> {sub(uc < 0xe000, c), 1, <span class="keyword">false</span>, p, p0};</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  }</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  }</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span> };</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="comment">// Non-validating implementations ------------------------------------------ ***</span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="keyword">class </span>UnsafeUTFImpl;</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="comment">// UTF-8</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span> <span class="keyword">class </span>UnsafeUTFImpl<</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  CP32,</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  UnitIter,</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 1>> {</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p) {</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="comment">// Very similar to U8_FWD_1_UNSAFE().</span></div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  uint8_t b = *p;</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  std::advance(p, 1 + <a class="code" href="utf8_8h.html#a32281421a1d07ef0de83e7f44c5d7ba2">U8_COUNT_TRAIL_BYTES_UNSAFE</a>(b));</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  }</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span> </div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter &p) {</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="comment">// Very similar to U8_BACK_1_UNSAFE().</span></div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="keywordflow">while</span> (<a class="code" href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a>(*--p)) {}</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  }</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> </div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) {</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="comment">// Very similar to U8_NEXT_UNSAFE().</span></div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  CP32 c = uint8_t(*p);</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  ++p;</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a8f3a9427d880458a9fa6b169a3cc1b3c">U8_IS_SINGLE</a>(c)) {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">return</span> {c, 1, p0, p};</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">return</span> {c, 1};</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c < 0xe0) {</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  c = ((c & 0x1f) << 6) | (*p & 0x3f);</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  ++p;</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordflow">return</span> {c, 2, p0, p};</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="keywordflow">return</span> {c, 2};</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (c < 0xf0) {</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="comment">// No need for (c&0xf) because the upper bits are truncated</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="comment">// after <<12 in the cast to uint16_t.</span></div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  c = uint16_t(c << 12) | ((*p & 0x3f) << 6);</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  ++p;</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  c |= *p & 0x3f;</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  ++p;</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">return</span> {c, 3, p0, p};</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordflow">return</span> {c, 3};</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  c = ((c & 7) << 18) | ((*p & 0x3f) << 12);</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  ++p;</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  c |= (*p & 0x3f) << 6;</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  ++p;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  c |= *p & 0x3f;</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  ++p;</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keywordflow">return</span> {c, 4, p0, p};</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">return</span> {c, 4};</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  }</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  }</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  }</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span> </div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) {</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="comment">// Very similar to U8_PREV_UNSAFE().</span></div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  UnitIter p0 = p;</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  CP32 c = uint8_t(*--p);</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">if</span> (<a class="code" href="utf8_8h.html#a8f3a9427d880458a9fa6b169a3cc1b3c">U8_IS_SINGLE</a>(c)) {</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="keywordflow">return</span> {c, 1, p, p0};</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  }</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="comment">// U8_IS_TRAIL(c) if well-formed</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  c &= 0x3f;</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  uint8_t count = 1;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keywordflow">for</span> (uint8_t shift = 6;;) {</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  uint8_t b = *--p;</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="keywordflow">if</span> (b >= 0xc0) {</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <a class="code" href="utf8_8h.html#ae8ed1045986b8bf27814e9bc78388961">U8_MASK_LEAD_BYTE</a>(b, count);</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  c |= uint32_t{b} << shift;</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  c |= (uint32_t{b} & 0x3f) << shift;</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  ++count;</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  shift += 6;</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  }</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  }</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  ++count;</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <span class="keywordflow">return</span> {c, count, p, p0};</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  }</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> };</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> </div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span> <span class="comment">// UTF-16</span></div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> <span class="keyword">class </span>UnsafeUTFImpl<</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  CP32,</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  UnitIter,</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 2>> {</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p) {</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="comment">// Very similar to U16_FWD_1_UNSAFE().</span></div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="keyword">auto</span> c = *p;</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  ++p;</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a>(c)) {</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  ++p;</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  }</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  }</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span> </div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter &p) {</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="comment">// Very similar to U16_BACK_1_UNSAFE().</span></div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="keywordflow">if</span> (<a class="code" href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a>(*--p)) {</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  --p;</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  }</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  }</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> </div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) {</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="comment">// Very similar to U16_NEXT_UNSAFE().</span></div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  CP32 c = <span class="keyword">static_cast<</span>CP32<span class="keyword">></span>(*p);</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  ++p;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keywordflow">if</span> (!<a class="code" href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a>(c)) {</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordflow">return</span> {c, 1, p0, p};</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keywordflow">return</span> {c, 1};</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  }</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  uint16_t c2 = *p;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  ++p;</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  c = <a class="code" href="utf16_8h.html#ac1deffbf1956d9fe696129515e88f006">U16_GET_SUPPLEMENTARY</a>(c, c2);</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <span class="keywordflow">return</span> {c, 2, p0, p};</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="keywordflow">return</span> {c, 2};</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  }</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> </div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) {</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="comment">// Very similar to U16_PREV_UNSAFE().</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  UnitIter p0 = p;</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  CP32 c = <span class="keyword">static_cast<</span>CP32<span class="keyword">></span>(*--p);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  <span class="keywordflow">if</span> (!<a class="code" href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a>(c)) {</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">return</span> {c, 1, p, p0};</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  uint16_t c2 = *--p;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  c = <a class="code" href="utf16_8h.html#ac1deffbf1956d9fe696129515e88f006">U16_GET_SUPPLEMENTARY</a>(c2, c);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  <span class="keywordflow">return</span> {c, 2, p, p0};</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  }</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> };</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span> </div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span> <span class="comment">// UTF-32: trivial</span></div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> <span class="keyword">class </span>UnsafeUTFImpl<</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  CP32,</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  UnitIter,</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 4>> {</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> inc(UnitIter &p) {</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  ++p;</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  }</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> </div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> <span class="keywordtype">void</span> dec(UnitIter &p) {</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  --p;</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  }</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> </div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) {</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  constexpr <span class="keywordtype">bool</span> isMultiPass = prv::forward_iterator<UnitIter>;</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  CP32 c = *p;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  ++p;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="keywordflow">if</span> constexpr (isMultiPass) {</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="keywordflow">return</span> {c, 1, p0, p};</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="keywordflow">return</span> {c, 1};</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  }</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  }</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> </div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">static</span> UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) {</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  UnitIter p0 = p;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  CP32 c = *--p;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="keywordflow">return</span> {c, 1, p, p0};</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  }</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> };</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> </div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> </div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> <span class="comment">// Validating iterators ---------------------------------------------------- ***</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> </div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a> behavior,</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter = UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l01102"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html"> 1102</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <span class="keyword">using</span> Impl = UTFImpl<CP32, behavior, UnitIter, LimitIter>;</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> </div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// Proxy type for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="comment">// so that we don't promise always returning CodeUnits.</span></div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keyword">explicit</span> Proxy(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a> &units) : units_(units) {}</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab">operator*</a>() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a> *<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935">operator-></a>() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a> units_;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  };</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> </div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01119"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a296417432d1a0f534691f61c42e82287"> 1119</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">value_type</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a>;</div><div class="line"><a name="l01121"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23f9e0a7fe8610bae1ea89641d3da566"> 1121</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">reference</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a296417432d1a0f534691f61c42e82287">value_type</a>;</div><div class="line"><a name="l01123"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac072a8a799042be68af0e5bdfff2d5ac"> 1123</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac072a8a799042be68af0e5bdfff2d5ac">pointer</a> = Proxy;</div><div class="line"><a name="l01125"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#afd38b3b357996c6ca48f770d75f9e88e"> 1125</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#afd38b3b357996c6ca48f770d75f9e88e">difference_type</a> = <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">prv::iter_difference_t<UnitIter></a>;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a7c9f027fcb3bfa432508f4653fe2fc5c">iterator_category</a> = std::conditional_t<</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  prv::bidirectional_iterator<UnitIter>,</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  std::bidirectional_iterator_tag,</div><div class="line"><a name="l01130"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a7c9f027fcb3bfa432508f4653fe2fc5c"> 1130</a></span>  std::forward_iterator_tag>;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span> </div><div class="line"><a name="l01145"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac4dfa33735e8be9e85912602712015c3"> 1145</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac4dfa33735e8be9e85912602712015c3">UTFIterator</a>(UnitIter start, UnitIter p, LimitIter limit) :</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  p_(p), start_(start), limit_(limit), units_(0, 0, false, p, p) {}</div><div class="line"><a name="l01158"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#aea325c59db112a20e4c3e66a1e22078c"> 1158</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#aea325c59db112a20e4c3e66a1e22078c">UTFIterator</a>(UnitIter p, LimitIter limit) :</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  p_(p), start_(p), limit_(limit), units_(0, 0, false, p, p) {}</div><div class="line"><a name="l01171"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a9f0ca4d36cadad862a78ca4ca18caae7"> 1171</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a9f0ca4d36cadad862a78ca4ca18caae7">UTFIterator</a>(UnitIter p) : p_(p), start_(p), limit_(p), units_(0, 0, false, p, p) {}</div><div class="line"><a name="l01177"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09"> 1177</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>() : p_{}, start_{}, limit_{}, units_(0, 0, <span class="keyword">false</span>, p_, p_) {}</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> </div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23fa36a3842fee500146570b36c08ee6">operator=</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23fa36a3842fee500146570b36c08ee6">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> </div><div class="line"><a name="l01194"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68"> 1194</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="keywordflow">return</span> getLogicalPosition() == other.getLogicalPosition();</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  }</div><div class="line"><a name="l01202"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1"> 1202</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(other); }</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> </div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <span class="comment">// Asymmetric equality & nonequality with a sentinel type.</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span> </div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  std::enable_if_t<</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01216"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab53349a772a848214fa5f83cc74030e4"> 1216</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab53349a772a848214fa5f83cc74030e4">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) {</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="keywordflow">return</span> iter.getLogicalPosition() == s;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  }</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> </div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION < 20</span></div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <span class="comment">// C++17: Need to define all four combinations of == / != vs. parameter order.</span></div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="comment">// Once we require C++20, we could remove all but the first == because</span></div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <span class="comment">// the compiler would generate the rest.</span></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  std::enable_if_t<</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01235"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a0f87972c82d00bad66715546edddd501"> 1235</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a0f87972c82d00bad66715546edddd501">operator==</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &iter) {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <span class="keywordflow">return</span> iter.getLogicalPosition() == s;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  }</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  std::enable_if_t<</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01248"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a5f9ce5ada172cc48285bb744578fed19"> 1248</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a5f9ce5ada172cc48285bb744578fed19">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  std::enable_if_t<</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01259"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab36e2322d082d7d53bd91c1a9a3c4dbd"> 1259</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab36e2322d082d7d53bd91c1a9a3c4dbd">operator!=</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &iter) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> <span class="preprocessor">#endif // C++17</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> </div><div class="line"><a name="l01268"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab"> 1268</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">CodeUnits<CP32, UnitIter></a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab">operator*</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  UnitIter p0 = p_;</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  units_ = Impl::readAndInc(p0, p_, limit_);</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  state_ = 1;</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  }</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  }</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> </div><div class="line"><a name="l01285"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935"> 1285</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935">operator-></a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  UnitIter p0 = p_;</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  units_ = Impl::readAndInc(p0, p_, limit_);</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  state_ = 1;</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  }</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  }</div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> </div><div class="line"><a name="l01300"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad8d25b256f2e2cc6c87f035baeeb80e9"> 1300</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad8d25b256f2e2cc6c87f035baeeb80e9">operator++</a>() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  state_ = 0;</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  Impl::inc(p_, limit_);</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ < 0 */</span> {</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <span class="comment">// operator--() called decAndRead() so we know how far to skip.</span></div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>();</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  state_ = 0;</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  }</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  }</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> </div><div class="line"><a name="l01322"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad6421355a9302ec59dad67d1a2b0ef81"> 1322</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad6421355a9302ec59dad67d1a2b0ef81">operator++</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  state_ = 0;</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  UnitIter p0 = p_;</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  units_ = Impl::readAndInc(p0, p_, limit_);</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  result.state_ = 1;</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  <span class="comment">// keep this->state_ == 0</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ < 0 */</span> {</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="comment">// operator--() called decAndRead() so we know how far to skip.</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>();</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  state_ = 0;</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  }</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> </div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Iter = UnitIter></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a></div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  std::enable_if_t<prv::bidirectional_iterator<Iter>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> &></div><div class="line"><a name="l01354"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abde3a7ca743e5befec51d3befd7363be"> 1354</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abde3a7ca743e5befec51d3befd7363be">operator--</a>() { <span class="comment">// pre-decrement</span></div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="comment">// operator*() called readAndInc() so p_ is ahead of the logical position.</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>();</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  }</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  units_ = Impl::decAndRead(start_, p_);</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  state_ = -1;</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  }</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> </div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Iter = UnitIter></div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  std::enable_if_t<prv::bidirectional_iterator<Iter>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a>></div><div class="line"><a name="l01374"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a12e65a84f22d47812f6aeeb53c09db2c"> 1374</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a12e65a84f22d47812f6aeeb53c09db2c">operator--</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-decrement</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abde3a7ca743e5befec51d3befd7363be">operator--</a>();</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  }</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> </div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="keyword">private</span>:</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="keyword">friend</span> <span class="keyword">class </span>std::reverse_iterator<<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator</a><CP32, behavior, UnitIter>>;</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span> </div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnitIter getLogicalPosition()<span class="keyword"> const </span>{</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keywordflow">return</span> state_ <= 0 ? p_ : units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>();</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  }</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> </div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  <span class="comment">// In a validating iterator, we need start_ & limit_ so that when we read a code point</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  <span class="comment">// (forward or backward) we can test if there are enough code units.</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  UnitIter start_;</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  LimitIter limit_;</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="comment">// Keep state so that we call readAndInc() only once for both operator*() and ++</span></div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  <span class="comment">// to make it easy for the compiler to optimize.</span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keyword">mutable</span> CodeUnits<CP32, UnitIter> units_;</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="comment">// >0: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="comment">// which means that p_ is ahead of its logical position</span></div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="comment">// 0: initial state</span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="comment">// <0: units_ = decAndRead(), p_ = units start</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="keyword">mutable</span> int8_t state_ = 0;</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span> };</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> </div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> <span class="comment">// Partial template specialization for single-pass input iterator.</span></div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter></div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> <span class="keyword">class </span>UTFIterator<</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  CP32, behavior,</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  UnitIter, LimitIter,</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  std::enable_if_t<!prv::forward_iterator<UnitIter>>> {</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keyword">using</span> Impl = UTFImpl<CP32, behavior, UnitIter, LimitIter>;</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> </div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="comment">// Proxy type for post-increment return value, to make *iter++ work.</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="comment">// Also for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="comment">// so that we don't promise always returning CodeUnits.</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="keyword">explicit</span> Proxy(CodeUnits<CP32, UnitIter> &units) : units_(units) {}</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  CodeUnits<CP32, UnitIter> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab">operator*</a>() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  CodeUnits<CP32, UnitIter> *<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935">operator-></a>() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  CodeUnits<CP32, UnitIter> units_;</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  };</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span> </div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a296417432d1a0f534691f61c42e82287">value_type</a> = CodeUnits<CP32, UnitIter>;</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23f9e0a7fe8610bae1ea89641d3da566">reference</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a296417432d1a0f534691f61c42e82287">value_type</a>;</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac072a8a799042be68af0e5bdfff2d5ac">pointer</a> = Proxy;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#afd38b3b357996c6ca48f770d75f9e88e">difference_type</a> = prv::iter_difference_t<UnitIter>;</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a7c9f027fcb3bfa432508f4653fe2fc5c">iterator_category</a> = std::input_iterator_tag;</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> </div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(UnitIter p, LimitIter limit) : p_(std::move(p)), limit_(std::move(limit)) {}</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span> </div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="comment">// Constructs an iterator start or limit sentinel.</span></div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="comment">// Requires p to be copyable.</span></div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(UnitIter p) : p_(std::move(p)), limit_(p_) {}</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span> </div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23fa36a3842fee500146570b36c08ee6">operator=</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> </div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23fa36a3842fee500146570b36c08ee6">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> </div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">return</span> p_ == other.p_ && ahead_ == other.ahead_;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  <span class="comment">// Strictly speaking, we should check if the logical position is the same.</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="comment">// However, we cannot advance, or do arithmetic with, a single-pass UnitIter.</span></div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  }</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(other); }</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span> </div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  std::enable_if_t<</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) {</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordflow">return</span> !iter.ahead_ && iter.p_ == s;</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  }</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> </div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION < 20</span></div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  std::enable_if_t<</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">operator==</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &iter) {</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="keywordflow">return</span> !iter.ahead_ && iter.p_ == s;</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  }</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> </div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  std::enable_if_t<</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> </div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  std::enable_if_t<</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1">operator!=</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &iter) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span> <span class="preprocessor">#endif // C++17</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span> </div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> CodeUnits<CP32, UnitIter> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab">operator*</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  <span class="keywordflow">if</span> (!ahead_) {</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  units_ = Impl::readAndInc(p_, p_, limit_);</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  ahead_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  }</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  }</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> </div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935">operator-></a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  <span class="keywordflow">if</span> (!ahead_) {</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  units_ = Impl::readAndInc(p_, p_, limit_);</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  ahead_ = <span class="keyword">true</span>;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  }</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  }</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> </div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">UTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad8d25b256f2e2cc6c87f035baeeb80e9">operator++</a>() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  <span class="keywordflow">if</span> (ahead_) {</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  Impl::inc(p_, limit_);</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  }</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  }</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span> </div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad8d25b256f2e2cc6c87f035baeeb80e9">operator++</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  <span class="keywordflow">if</span> (ahead_) {</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  units_ = Impl::readAndInc(p_, p_, limit_);</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="comment">// keep this->ahead_ == false</span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  }</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  }</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> </div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="keyword">private</span>:</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  <span class="comment">// In a validating iterator, we need limit_ so that when we read a code point</span></div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <span class="comment">// we can test if there are enough code units.</span></div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  LimitIter limit_;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="comment">// Keep state so that we call readAndInc() only once for both operator*() and ++</span></div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="comment">// so that we can use a single-pass input iterator for UnitIter.</span></div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  <span class="keyword">mutable</span> CodeUnits<CP32, UnitIter> units_ = {0, 0, <span class="keyword">false</span>};</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="comment">// true: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="comment">// which means that p_ is ahead of its logical position</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="comment">// false: initial state</span></div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <span class="keyword">mutable</span> <span class="keywordtype">bool</span> ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> };</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> } <span class="comment">// namespace U_HEADER_ONLY_NAMESPACE</span></div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> </div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment">// Bespoke specialization of reverse_iterator.</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="comment">// The default implementation implements reverse operator*() and ++ in a way</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment">// that does most of the same work twice for reading variable-length sequences.</span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="keyword">class </span>std::reverse_iterator<<a class="code" href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a>::UTFIterator<CP32, behavior, UnitIter>> {</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="keyword">using</span> Impl = U_HEADER_ONLY_NAMESPACE::UTFImpl<CP32, behavior, UnitIter>;</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <span class="keyword">using</span> CodeUnits_ = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">U_HEADER_ONLY_NAMESPACE::CodeUnits<CP32, UnitIter></a>;</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> </div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="comment">// Proxy type for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  <span class="comment">// so that we don't promise always returning CodeUnits.</span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="keyword">explicit</span> Proxy(CodeUnits_ units) : units_(units) {}</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  CodeUnits_ &operator*() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  CodeUnits_ *operator->() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  CodeUnits_ units_;</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  };</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> </div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  <span class="keyword">using</span> value_type = CodeUnits_;</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  <span class="keyword">using</span> reference = value_type;</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  <span class="keyword">using</span> pointer = Proxy;</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <span class="keyword">using</span> difference_type = <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">U_HEADER_ONLY_NAMESPACE::prv::iter_difference_t<UnitIter></a>;</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="keyword">using</span> iterator_category = std::bidirectional_iterator_tag;</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span> </div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">U_HEADER_ONLY_NAMESPACE::UTFIterator<CP32, behavior, UnitIter></a> iter) :</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  p_(iter.getLogicalPosition()), start_(iter.start_), limit_(iter.limit_),</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  units_(0, 0, false, p_, p_) {}</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator() : p_{}, start_{}, limit_{}, units_(0, 0, <span class="keyword">false</span>, p_, p_) {}</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span> </div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator(reverse_iterator &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator=(reverse_iterator &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator(<span class="keyword">const</span> reverse_iterator &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator=(<span class="keyword">const</span> reverse_iterator &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> </div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="namespaceicu.html#a5e840c3254f3b18f2b2f2662b8495d52">operator==</a>(<span class="keyword">const</span> reverse_iterator &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  <span class="keywordflow">return</span> getLogicalPosition() == other.getLogicalPosition();</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  }</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="namespaceicu.html#a8d8f68e93f4a83a227b82cec7745dff6">operator!=</a>(<span class="keyword">const</span> reverse_iterator &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="namespaceicu.html#a5e840c3254f3b18f2b2f2662b8495d52">operator==</a>(other); }</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span> </div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> CodeUnits_ operator*()<span class="keyword"> const </span>{</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  units_ = Impl::decAndRead(start_, p_);</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  state_ = -1;</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  }</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  }</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> </div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy operator->()<span class="keyword"> const </span>{</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  units_ = Impl::decAndRead(start_, p_);</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  state_ = -1;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  }</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  }</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span> </div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator++() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  <span class="comment">// operator*() called decAndRead() so p_ is already behind.</span></div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  state_ = 0;</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  Impl::dec(start_, p_);</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ > 0 */</span> {</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <span class="comment">// operator--() called readAndInc() so we know how far to skip.</span></div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  p_ = units_.begin();</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  state_ = 0;</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  }</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  }</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span> </div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator operator++(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="comment">// operator*() called decAndRead() so p_ is already behind.</span></div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  state_ = 0;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  units_ = Impl::decAndRead(start_, p_);</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  result.state_ = -1;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="comment">// keep this->state_ == 0</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ > 0 */</span> {</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  <span class="comment">// operator--() called readAndInc() so we know how far to skip.</span></div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  p_ = units_.begin();</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  state_ = 0;</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  }</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  }</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> </div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator--() { <span class="comment">// pre-decrement</span></div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="comment">// operator*() called decAndRead() so p_ is behind the logical position.</span></div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  p_ = units_.end();</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  }</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  UnitIter p0 = p_;</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  units_ = Impl::readAndInc(p0, p_, limit_);</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  state_ = 1;</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  }</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> </div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator operator--(<span class="keywordtype">int</span>) { <span class="comment">// post-decrement</span></div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  operator--();</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  }</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> </div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span> <span class="keyword">private</span>:</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnitIter getLogicalPosition()<span class="keyword"> const </span>{</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordflow">return</span> state_ >= 0 ? p_ : units_.end();</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  }</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span> </div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  <span class="comment">// In a validating iterator, we need start_ & limit_ so that when we read a code point</span></div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="comment">// (forward or backward) we can test if there are enough code units.</span></div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  UnitIter start_;</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  UnitIter limit_;</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <span class="comment">// Keep state so that we call decAndRead() only once for both operator*() and ++</span></div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="comment">// to make it easy for the compiler to optimize.</span></div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="keyword">mutable</span> CodeUnits_ units_;</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="comment">// >0: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="comment">// 0: initial state</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <span class="comment">// <0: units_ = decAndRead(), p_ = units start</span></div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  <span class="comment">// which means that p_ is behind its logical position</span></div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  <span class="keyword">mutable</span> int8_t state_ = 0;</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span> };</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span> </div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span> <span class="keyword">namespace </span><a class="code" href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a> {</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> </div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a> behavior,</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter = UnitIter></div><div class="line"><a name="l01696"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a81f9f64c82a3b29389483be3c65c581d"> 1696</a></span> <span class="keyword">auto</span> <a class="code" href="utfiterator_8h.html#a81f9f64c82a3b29389483be3c65c581d">utfIterator</a>(UnitIter start, UnitIter p, LimitIter limit) {</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator<CP32, behavior, UnitIter, LimitIter></a>(</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  std::move(start), std::move(p), std::move(limit));</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> }</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span> </div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <a class="code" href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a> behavior,</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> LimitIter = UnitIter></div><div class="line"><a name="l01723"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a70b94948e46469f2252eace654ad2737"> 1723</a></span> <span class="keyword">auto</span> <a class="code" href="utfiterator_8h.html#a81f9f64c82a3b29389483be3c65c581d">utfIterator</a>(UnitIter p, LimitIter limit) {</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator<CP32, behavior, UnitIter, LimitIter></a>(</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  std::move(p), std::move(limit));</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> }</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> </div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span> <span class="comment">// Note: We should only enable the following factory function for a copyable UnitIter.</span></div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span> <span class="comment">// In C++17, we would have to partially specialize with enable_if_t testing for forward_iterator,</span></div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> <span class="comment">// but a function template partial specialization is not allowed.</span></div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span> <span class="comment">// In C++20, we might be able to require the std::copyable concept.</span></div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> </div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l01753"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a29e66074fd42156e7cd1928ba3e88860"> 1753</a></span> <span class="keyword">auto</span> <a class="code" href="utfiterator_8h.html#a81f9f64c82a3b29389483be3c65c581d">utfIterator</a>(UnitIter p) {</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">UTFIterator<CP32, behavior, UnitIter></a>(std::move(p));</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> }</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span> </div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> Range></div><div class="line"><a name="l01785"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html"> 1785</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints</a> {</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a38a8e605c0ba127da652dca32163be88">UTFStringCodePoints</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> </div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<!std::is_reference_v<R>>></div><div class="line"><a name="l01800"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a8f374862db7701a9cf7683bf5a76e464"> 1800</a></span>  <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a8f374862db7701a9cf7683bf5a76e464">UTFStringCodePoints</a>(Range unitRange) : unitRange(std::move(unitRange)) {}</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<std::is_reference_v<R>>, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l01810"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#adce9b528fc416ae4cb952361b06dad81"> 1810</a></span>  <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#adce9b528fc416ae4cb952361b06dad81">UTFStringCodePoints</a>(Range unitRange) : unitRange(unitRange) {}</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> </div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a38a8e605c0ba127da652dca32163be88">UTFStringCodePoints</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span> </div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a8d24d3902f047ac09e5d720fdd28fbbb">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span> </div><div class="line"><a name="l01822"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a35839f3b250161748e6681dc79301fd9"> 1822</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a35839f3b250161748e6681dc79301fd9">begin</a>() {</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end());</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  }</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> </div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<prv::range<const R>>></div><div class="line"><a name="l01831"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a2f65e0ed36ee6309ec77e35a865cd0aa"> 1831</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a2f65e0ed36ee6309ec77e35a865cd0aa">begin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end());</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  }</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> </div><div class="line"><a name="l01839"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a93bef215aeb1aec47030f9882cca909f"> 1839</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a93bef215aeb1aec47030f9882cca909f">end</a>() {</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  <span class="keyword">using</span> UnitIter = decltype(unitRange.begin());</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  <span class="keyword">using</span> LimitIter = decltype(unitRange.end());</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  <span class="keywordflow">if</span> constexpr (!std::is_same_v<UnitIter, LimitIter>) {</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="comment">// Return the code unit sentinel.</span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <span class="keywordflow">return</span> unitRange.end();</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr (prv::bidirectional_iterator<UnitIter>) {</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end(), unitRange.end());</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  <span class="comment">// The input iterator specialization has no three-argument constructor.</span></div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.end(), unitRange.end());</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  }</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span> </div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<prv::range<const R>>></div><div class="line"><a name="l01858"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#aeeac0ee59c91d65411130686cc9622af"> 1858</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#aeeac0ee59c91d65411130686cc9622af">end</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  <span class="keyword">using</span> UnitIter = decltype(unitRange.begin());</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  <span class="keyword">using</span> LimitIter = decltype(unitRange.end());</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  <span class="keywordflow">if</span> constexpr (!std::is_same_v<UnitIter, LimitIter>) {</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  <span class="comment">// Return the code unit sentinel.</span></div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  <span class="keywordflow">return</span> unitRange.end();</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr (prv::bidirectional_iterator<UnitIter>) {</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end(), unitRange.end());</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  <span class="comment">// The input iterator specialization has no three-argument constructor.</span></div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  <span class="keywordflow">return</span> utfIterator<CP32, behavior>(unitRange.end(), unitRange.end());</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  }</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  }</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> </div><div class="line"><a name="l01876"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a6142c66a710573f593626da46f62270c"> 1876</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a6142c66a710573f593626da46f62270c">rbegin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  <span class="keywordflow">return</span> std::make_reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a93bef215aeb1aec47030f9882cca909f">end</a>());</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  }</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span> </div><div class="line"><a name="l01884"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a533834dbbfc4c2c82f8ee6d7fa04b182"> 1884</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a533834dbbfc4c2c82f8ee6d7fa04b182">rend</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  <span class="keywordflow">return</span> std::make_reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a35839f3b250161748e6681dc79301fd9">begin</a>());</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  }</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span> </div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span> <span class="keyword">private</span>:</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  Range unitRange;</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span> };</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span> </div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior></div><div class="line"><a name="l01894"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html"> 1894</a></span> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html">UTFStringCodePointsAdaptor</a></div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span> #if <a class="code" href="platform_8h.html#a4c53610262c068e4d5201030f668d422">U_CPLUSPLUS_VERSION</a> >= 23 && __cpp_lib_ranges >= 2022<span class="stringliteral">'02 && \</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span> <span class="stringliteral"> __cpp_lib_bind_back >= 2022'</span>02 <span class="comment">// http://wg21.link/P2387R3.</span></div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  : std::ranges::range_adaptor_closure<UTFStringCodePointsAdaptor<CP32, behavior>></div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span> {</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Range></div><div class="line"><a name="l01902"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html#adb7e33cc0b4a4a6ad934e29a367e157d"> 1902</a></span>  <span class="keyword">auto</span> <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html#adb7e33cc0b4a4a6ad934e29a367e157d">operator()</a>(Range &&unitRange)<span class="keyword"> const </span>{</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span> <span class="preprocessor">#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 2021'10 // We need https://wg21.link/P2415R2.</span></div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints<CP32, behavior, std::ranges::views::all_t<Range></a>>(</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  std::forward<Range>(unitRange));</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keywordflow">if</span> constexpr (prv::is_basic_string_view_v<std::decay_t<Range>>) {</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <span class="comment">// Take basic_string_view by copy, not by reference. In C++20 this is handled by</span></div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <span class="comment">// all_t<Range>, which is Range if Range is a view.</span></div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints<CP32, behavior, std::decay_t<Range></a>>(</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  std::forward<Range>(unitRange));</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">UTFStringCodePoints<CP32, behavior, Range></a>(std::forward<Range>(unitRange));</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  }</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  }</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span> };</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span> </div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior></div><div class="line"><a name="l01934"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a984a43b6a404be5a37425475b5992285"> 1934</a></span> constexpr <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html">UTFStringCodePointsAdaptor<CP32, behavior></a> <a class="code" href="utfiterator_8h.html#a984a43b6a404be5a37425475b5992285">utfStringCodePoints</a>;</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span> </div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span> <span class="comment">// Non-validating iterators ------------------------------------------------ ***</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span> </div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l01960"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html"> 1960</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> {</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  <span class="keyword">using</span> Impl = UnsafeUTFImpl<CP32, UnitIter>;</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span> </div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="comment">// Proxy type for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  <span class="comment">// so that we don't promise always returning UnsafeCodeUnits.</span></div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <span class="keyword">explicit</span> Proxy(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a> &units) : units_(units) {}</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0">operator*</a>() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a> *<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f">operator-></a>() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a> units_;</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  };</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span> </div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span> <span class="keyword">public</span>:</div><div class="line"><a name="l01977"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a08962fca97cf34b32f2fe94416a9cedf"> 1977</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">value_type</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a>;</div><div class="line"><a name="l01979"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2561ce55cd228df3188a6c5720ee2b01"> 1979</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">reference</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a08962fca97cf34b32f2fe94416a9cedf">value_type</a>;</div><div class="line"><a name="l01981"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a5cab858a81dcba23db907c98bdbb5797"> 1981</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a5cab858a81dcba23db907c98bdbb5797">pointer</a> = Proxy;</div><div class="line"><a name="l01983"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a6520a007dff4671d9e405e628e4f59e1"> 1983</a></span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a6520a007dff4671d9e405e628e4f59e1">difference_type</a> = <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">prv::iter_difference_t<UnitIter></a>;</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2ac94c1a5fcc6b187558fa284e46208b">iterator_category</a> = std::conditional_t<</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  prv::bidirectional_iterator<UnitIter>,</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  std::bidirectional_iterator_tag,</div><div class="line"><a name="l01988"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2ac94c1a5fcc6b187558fa284e46208b"> 1988</a></span>  std::forward_iterator_tag>;</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span> </div><div class="line"><a name="l01999"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4b3686f14ab781f3b21cf9427135bd7"> 1999</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4b3686f14ab781f3b21cf9427135bd7">UnsafeUTFIterator</a>(UnitIter p) : p_(p), units_(0, 0, p, p) {}</div><div class="line"><a name="l02005"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f"> 2005</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>() : p_{}, units_(0, 0, p_, p_) {}</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span> </div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ad7de01ae4c9a184a2c6d7d02f3cea3f4">operator=</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span> </div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ad7de01ae4c9a184a2c6d7d02f3cea3f4">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span> </div><div class="line"><a name="l02022"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f"> 2022</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="keywordflow">return</span> getLogicalPosition() == other.getLogicalPosition();</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  }</div><div class="line"><a name="l02030"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0"> 2030</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(other); }</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> </div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  std::enable_if_t<</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02042"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a32e210208304c554b478f57f4b6636e4"> 2042</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a32e210208304c554b478f57f4b6636e4">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) {</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="keywordflow">return</span> iter.getLogicalPosition() == s;</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  }</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span> </div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION < 20</span></div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span> </div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  std::enable_if_t<</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02057"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a05a8fa613ee2c918167c9b6f01ccf8c0"> 2057</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a05a8fa613ee2c918167c9b6f01ccf8c0">operator==</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &iter) {</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="keywordflow">return</span> iter.getLogicalPosition() == s;</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  }</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  std::enable_if_t<</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02070"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2685693ce7d99d1b3eb4b80fc4ef81ec"> 2070</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2685693ce7d99d1b3eb4b80fc4ef81ec">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  std::enable_if_t<</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02081"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac91fe59003345bfc4b746b8d601da80d"> 2081</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac91fe59003345bfc4b746b8d601da80d">operator!=</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &iter) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span> <span class="preprocessor">#endif // C++17</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span> </div><div class="line"><a name="l02090"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0"> 2090</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">UnsafeCodeUnits<CP32, UnitIter></a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0">operator*</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  UnitIter p0 = p_;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  units_ = Impl::readAndInc(p0, p_);</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  state_ = 1;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  }</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  }</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span> </div><div class="line"><a name="l02107"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f"> 2107</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f">operator-></a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  UnitIter p0 = p_;</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  units_ = Impl::readAndInc(p0, p_);</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  state_ = 1;</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  }</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  }</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> </div><div class="line"><a name="l02122"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4a7fa17145953496a18d1ddecbaa31a"> 2122</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4a7fa17145953496a18d1ddecbaa31a">operator++</a>() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  state_ = 0;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  Impl::inc(p_);</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ < 0 */</span> {</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  <span class="comment">// operator--() called decAndRead() so we know how far to skip.</span></div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>();</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  state_ = 0;</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  }</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  }</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span> </div><div class="line"><a name="l02144"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a8ed567739d14c82bcfa2563ea2d9b433"> 2144</a></span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a8ed567739d14c82bcfa2563ea2d9b433">operator++</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  state_ = 0;</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  UnitIter p0 = p_;</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  units_ = Impl::readAndInc(p0, p_);</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  result.state_ = 1;</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="comment">// keep this->state_ == 0</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ < 0 */</span> {</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="comment">// operator--() called decAndRead() so we know how far to skip.</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">end</a>();</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  state_ = 0;</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  }</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  }</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span> </div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Iter = UnitIter></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a></div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  std::enable_if_t<prv::bidirectional_iterator<Iter>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> &></div><div class="line"><a name="l02176"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a01201f10dbec79504ab159c87ec92096"> 2176</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a01201f10dbec79504ab159c87ec92096">operator--</a>() { <span class="comment">// pre-decrement</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  <span class="keywordflow">if</span> (state_ > 0) {</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  <span class="comment">// operator*() called readAndInc() so p_ is ahead of the logical position.</span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  p_ = units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>();</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  }</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  units_ = Impl::decAndRead(p_);</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  state_ = -1;</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  }</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span> </div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Iter = UnitIter></div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a></div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  std::enable_if_t<prv::bidirectional_iterator<Iter>, <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a>></div><div class="line"><a name="l02196"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a7d0a3b431701d67f3ae8d9969f0411ef"> 2196</a></span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a7d0a3b431701d67f3ae8d9969f0411ef">operator--</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-decrement</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a> result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a01201f10dbec79504ab159c87ec92096">operator--</a>();</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  }</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span> </div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span> <span class="keyword">private</span>:</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="keyword">friend</span> <span class="keyword">class </span>std::reverse_iterator<<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator</a><CP32, UnitIter>>;</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span> </div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnitIter getLogicalPosition()<span class="keyword"> const </span>{</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="keywordflow">return</span> state_ <= 0 ? p_ : units_.<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">begin</a>();</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  }</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span> </div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="comment">// Keep state so that we call readAndInc() only once for both operator*() and ++</span></div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  <span class="comment">// to make it easy for the compiler to optimize.</span></div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  <span class="keyword">mutable</span> UnsafeCodeUnits<CP32, UnitIter> units_;</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  <span class="comment">// >0: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="comment">// which means that p_ is ahead of its logical position</span></div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="comment">// 0: initial state</span></div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <span class="comment">// <0: units_ = decAndRead(), p_ = units start</span></div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  <span class="keyword">mutable</span> int8_t state_ = 0;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span> };</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span> </div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span> <span class="comment">// Partial template specialization for single-pass input iterator.</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span> <span class="keyword">class </span>UnsafeUTFIterator<</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  CP32,</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  UnitIter,</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  std::enable_if_t<!prv::forward_iterator<UnitIter>>> {</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="keyword">using</span> Impl = UnsafeUTFImpl<CP32, UnitIter>;</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span> </div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  <span class="comment">// Proxy type for post-increment return value, to make *iter++ work.</span></div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  <span class="comment">// Also for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  <span class="comment">// so that we don't promise always returning UnsafeCodeUnits.</span></div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  <span class="keyword">explicit</span> Proxy(UnsafeCodeUnits<CP32, UnitIter> &units) : units_(units) {}</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  UnsafeCodeUnits<CP32, UnitIter> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0">operator*</a>() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  UnsafeCodeUnits<CP32, UnitIter> *<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f">operator-></a>() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  UnsafeCodeUnits<CP32, UnitIter> units_;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  };</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span> </div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span> <span class="keyword">public</span>:</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a08962fca97cf34b32f2fe94416a9cedf">value_type</a> = UnsafeCodeUnits<CP32, UnitIter>;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2561ce55cd228df3188a6c5720ee2b01">reference</a> = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a08962fca97cf34b32f2fe94416a9cedf">value_type</a>;</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a5cab858a81dcba23db907c98bdbb5797">pointer</a> = Proxy;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a6520a007dff4671d9e405e628e4f59e1">difference_type</a> = prv::iter_difference_t<UnitIter>;</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="keyword">using</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2ac94c1a5fcc6b187558fa284e46208b">iterator_category</a> = std::input_iterator_tag;</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span> </div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>(UnitIter p) : p_(std::move(p)) {}</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span> </div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ad7de01ae4c9a184a2c6d7d02f3cea3f4">operator=</a>(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span> </div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ad7de01ae4c9a184a2c6d7d02f3cea3f4">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span> </div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  <span class="keywordflow">return</span> p_ == other.p_ && ahead_ == other.ahead_;</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  <span class="comment">// Strictly speaking, we should check if the logical position is the same.</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="comment">// However, we cannot advance, or do arithmetic with, a single-pass UnitIter.</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  }</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(other); }</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span> </div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  std::enable_if_t<</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) {</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keywordflow">return</span> !iter.ahead_ && iter.p_ == s;</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  }</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> </div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span> <span class="preprocessor">#if U_CPLUSPLUS_VERSION < 20</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  std::enable_if_t<</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">operator==</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &iter) {</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  <span class="keywordflow">return</span> !iter.ahead_ && iter.p_ == s;</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  }</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> </div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  std::enable_if_t<</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &iter, <span class="keyword">const</span> Sentinel &s) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span> </div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Sentinel> <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">friend</span></div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  std::enable_if_t<</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>,</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  <span class="keywordtype">bool</span>></div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0">operator!=</a>(<span class="keyword">const</span> Sentinel &s, <span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &iter) { <span class="keywordflow">return</span> !(iter == s); }</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> <span class="preprocessor">#endif // C++17</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> </div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnsafeCodeUnits<CP32, UnitIter> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0">operator*</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  <span class="keywordflow">if</span> (!ahead_) {</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  units_ = Impl::readAndInc(p_, p_);</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  ahead_ = <span class="keyword">true</span>;</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  }</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  }</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span> </div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f">operator-></a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  <span class="keywordflow">if</span> (!ahead_) {</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  units_ = Impl::readAndInc(p_, p_);</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  ahead_ = <span class="keyword">true</span>;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  }</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  }</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> </div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">UnsafeUTFIterator</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4a7fa17145953496a18d1ddecbaa31a">operator++</a>() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  <span class="keywordflow">if</span> (ahead_) {</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  Impl::inc(p_);</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  }</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  }</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span> </div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4a7fa17145953496a18d1ddecbaa31a">operator++</a>(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="keywordflow">if</span> (ahead_) {</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  <span class="comment">// operator*() called readAndInc() so p_ is already ahead.</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  units_ = Impl::readAndInc(p_, p_);</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  <span class="comment">// keep this->ahead_ == false</span></div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  }</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  }</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> </div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> <span class="keyword">private</span>:</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  <span class="comment">// Keep state so that we call readAndInc() only once for both operator*() and ++</span></div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  <span class="comment">// so that we can use a single-pass input iterator for UnitIter.</span></div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  <span class="keyword">mutable</span> UnsafeCodeUnits<CP32, UnitIter> units_ = {0, 0};</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  <span class="comment">// true: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="comment">// which means that p_ is ahead of its logical position</span></div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  <span class="comment">// false: initial state</span></div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  <span class="keyword">mutable</span> <span class="keywordtype">bool</span> ahead_ = <span class="keyword">false</span>;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> };</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span> </div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span> } <span class="comment">// namespace U_HEADER_ONLY_NAMESPACE</span></div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span> </div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span> <span class="preprocessor">#ifndef U_IN_DOXYGEN</span></div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span> <span class="comment">// Bespoke specialization of reverse_iterator.</span></div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span> <span class="comment">// The default implementation implements reverse operator*() and ++ in a way</span></div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span> <span class="comment">// that does most of the same work twice for reading variable-length sequences.</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span> <span class="keyword">class </span>std::reverse_iterator<<a class="code" href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a>::UnsafeUTFIterator<CP32, UnitIter>> {</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  <span class="keyword">using</span> Impl = U_HEADER_ONLY_NAMESPACE::UnsafeUTFImpl<CP32, UnitIter>;</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <span class="keyword">using</span> UnsafeCodeUnits_ = <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits<CP32, UnitIter></a>;</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span> </div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <span class="comment">// Proxy type for operator->() (required by LegacyInputIterator)</span></div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  <span class="comment">// so that we don't promise always returning UnsafeCodeUnits.</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  <span class="keyword">class </span>Proxy {</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  <span class="keyword">explicit</span> Proxy(UnsafeCodeUnits_ units) : units_(units) {}</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>  UnsafeCodeUnits_ &operator*() { <span class="keywordflow">return</span> units_; }</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  UnsafeCodeUnits_ *operator->() { <span class="keywordflow">return</span> &units_; }</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  UnsafeCodeUnits_ units_;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>  };</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> </div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span> <span class="keyword">public</span>:</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <span class="keyword">using</span> value_type = UnsafeCodeUnits_;</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="keyword">using</span> reference = value_type;</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  <span class="keyword">using</span> pointer = Proxy;</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <span class="keyword">using</span> difference_type = <a class="code" href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">U_HEADER_ONLY_NAMESPACE::prv::iter_difference_t<UnitIter></a>;</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <span class="keyword">using</span> iterator_category = std::bidirectional_iterator_tag;</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> </div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keyword">explicit</span> reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator<CP32, UnitIter></a> iter) :</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  p_(iter.getLogicalPosition()), units_(0, 0, p_, p_) {}</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator() : p_{}, units_(0, 0, p_, p_) {}</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> </div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator(reverse_iterator &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator=(reverse_iterator &&src) noexcept = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span> </div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator(<span class="keyword">const</span> reverse_iterator &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator=(<span class="keyword">const</span> reverse_iterator &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> </div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="namespaceicu.html#a5e840c3254f3b18f2b2f2662b8495d52">operator==</a>(<span class="keyword">const</span> reverse_iterator &other)<span class="keyword"> const </span>{</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>  <span class="keywordflow">return</span> getLogicalPosition() == other.getLogicalPosition();</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  }</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> <span class="keywordtype">bool</span> <a class="code" href="namespaceicu.html#a8d8f68e93f4a83a227b82cec7745dff6">operator!=</a>(<span class="keyword">const</span> reverse_iterator &other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="namespaceicu.html#a5e840c3254f3b18f2b2f2662b8495d52">operator==</a>(other); }</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> </div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnsafeCodeUnits_ operator*()<span class="keyword"> const </span>{</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  units_ = Impl::decAndRead(p_);</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  state_ = -1;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  }</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  <span class="keywordflow">return</span> units_;</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  }</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span> </div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> Proxy operator->()<span class="keyword"> const </span>{</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  units_ = Impl::decAndRead(p_);</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  state_ = -1;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  }</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="keywordflow">return</span> Proxy(units_);</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  }</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span> </div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator++() { <span class="comment">// pre-increment</span></div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  <span class="comment">// operator*() called decAndRead() so p_ is already behind.</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  state_ = 0;</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  Impl::dec(p_);</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ > 0 */</span> {</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  <span class="comment">// operator--() called readAndInc() so we know how far to skip.</span></div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  p_ = units_.begin();</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  state_ = 0;</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  }</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  }</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span> </div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator operator++(<span class="keywordtype">int</span>) { <span class="comment">// post-increment</span></div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="comment">// operator*() called decAndRead() so p_ is already behind.</span></div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  state_ = 0;</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (state_ == 0) {</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  units_ = Impl::decAndRead(p_);</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  result.state_ = -1;</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  <span class="comment">// keep this->state_ == 0</span></div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  } <span class="keywordflow">else</span> <span class="comment">/* state_ > 0 */</span> {</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  <span class="comment">// operator--() called readAndInc() so we know how far to skip.</span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>  p_ = units_.begin();</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>  state_ = 0;</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  }</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>  }</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> </div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator &operator--() { <span class="comment">// pre-decrement</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  <span class="keywordflow">if</span> (state_ < 0) {</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>  <span class="comment">// operator*() called decAndRead() so p_ is behind the logical position.</span></div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  p_ = units_.end();</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  }</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  UnitIter p0 = p_;</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  units_ = Impl::readAndInc(p0, p_);</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  state_ = 1;</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  }</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span> </div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> reverse_iterator operator--(<span class="keywordtype">int</span>) { <span class="comment">// post-decrement</span></div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  reverse_iterator result(*<span class="keyword">this</span>);</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  operator--();</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  }</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span> </div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> <span class="keyword">private</span>:</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  <a class="code" href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a> UnitIter getLogicalPosition()<span class="keyword"> const </span>{</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  <span class="keywordflow">return</span> state_ >= 0 ? p_ : units_.end();</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  }</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> </div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  <span class="comment">// operator*() etc. are logically const.</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  <span class="keyword">mutable</span> UnitIter p_;</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  <span class="comment">// Keep state so that we call decAndRead() only once for both operator*() and ++</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  <span class="comment">// to make it easy for the compiler to optimize.</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  <span class="keyword">mutable</span> UnsafeCodeUnits_ units_;</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  <span class="comment">// >0: units_ = readAndInc(), p_ = units limit</span></div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  <span class="comment">// 0: initial state</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  <span class="comment">// <0: units_ = decAndRead(), p_ = units start</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  <span class="comment">// which means that p_ is behind its logical position</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  <span class="keyword">mutable</span> int8_t state_ = 0;</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span> };</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span> <span class="preprocessor">#endif // U_IN_DOXYGEN</span></div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span> </div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span> <span class="keyword">namespace </span><a class="code" href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a> {</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> </div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> UnitIter></div><div class="line"><a name="l02494"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#a0173fdd0ff9c634956e829eaa5794465"> 2494</a></span> <span class="keyword">auto</span> <a class="code" href="utfiterator_8h.html#a0173fdd0ff9c634956e829eaa5794465">unsafeUTFIterator</a>(UnitIter iter) {</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">UnsafeUTFIterator<CP32, UnitIter></a>(std::move(iter));</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span> }</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span> </div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> Range></div><div class="line"><a name="l02526"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html"> 2526</a></span> <span class="keyword">class </span><a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints</a> {</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  static_assert(<span class="keyword">sizeof</span>(CP32) == 4, <span class="stringliteral">"CP32 must be a 32-bit type to hold a code point"</span>);</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span> <span class="keyword">public</span>:</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aa600c9ab6d26f0f005de9b49300a21d5">UnsafeUTFStringCodePoints</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span> </div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<!std::is_reference_v<R>>></div><div class="line"><a name="l02541"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ac87cb4ff66ba9495a6ad4c75630cc0e6"> 2541</a></span>  <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ac87cb4ff66ba9495a6ad4c75630cc0e6">UnsafeUTFStringCodePoints</a>(Range unitRange) : unitRange(std::move(unitRange)) {}</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<std::is_reference_v<R>>, <span class="keyword">typename</span> = <span class="keywordtype">void</span>></div><div class="line"><a name="l02551"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a61647c372561076f02aeb15b78161bd9"> 2551</a></span>  <span class="keyword">explicit</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a61647c372561076f02aeb15b78161bd9">UnsafeUTFStringCodePoints</a>(Range unitRange) : unitRange(unitRange) {}</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span> </div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aa600c9ab6d26f0f005de9b49300a21d5">UnsafeUTFStringCodePoints</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span> </div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints</a> &<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#af3e7a9b7939a3ddf638d6868917a2c4b">operator=</a>(<span class="keyword">const</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints</a> &other) = <span class="keywordflow">default</span>;</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span> </div><div class="line"><a name="l02563"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab8ea3c3a1f73a499fea4f6bbf871026c"> 2563</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab8ea3c3a1f73a499fea4f6bbf871026c">begin</a>() {</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="keywordflow">return</span> unsafeUTFIterator<CP32>(unitRange.begin());</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  }</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span> </div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<prv::range<const R>>></div><div class="line"><a name="l02572"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab2a26ededc56064f8474619e4ae3f87b"> 2572</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab2a26ededc56064f8474619e4ae3f87b">begin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  <span class="keywordflow">return</span> unsafeUTFIterator<CP32>(unitRange.begin());</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  }</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span> </div><div class="line"><a name="l02580"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a890b263fa86d948952ff06d0ea4fef5a"> 2580</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a890b263fa86d948952ff06d0ea4fef5a">end</a>() {</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>  <span class="keyword">using</span> UnitIter = decltype(unitRange.begin());</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  <span class="keyword">using</span> LimitIter = decltype(unitRange.end());</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  <span class="keywordflow">if</span> constexpr (!std::is_same_v<UnitIter, LimitIter>) {</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  <span class="comment">// Return the code unit sentinel.</span></div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  <span class="keywordflow">return</span> unitRange.end();</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  <span class="keywordflow">return</span> unsafeUTFIterator<CP32>(unitRange.end());</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  }</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  }</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span> </div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="keyword">template</span><<span class="keyword">typename</span> R = Range, <span class="keyword">typename</span> = std::enable_if_t<prv::range<const R>>></div><div class="line"><a name="l02596"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aed2bb49df2e0289fd7444ff0bf942cb3"> 2596</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aed2bb49df2e0289fd7444ff0bf942cb3">end</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  <span class="keyword">using</span> UnitIter = decltype(unitRange.begin());</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  <span class="keyword">using</span> LimitIter = decltype(unitRange.end());</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="keywordflow">if</span> constexpr (!std::is_same_v<UnitIter, LimitIter>) {</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="comment">// Return the code unit sentinel.</span></div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  <span class="keywordflow">return</span> unitRange.end();</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="keywordflow">return</span> unsafeUTFIterator<CP32>(unitRange.end());</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  }</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  }</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span> </div><div class="line"><a name="l02611"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aefda995f3082028d6b97a9f7e43d3756"> 2611</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aefda995f3082028d6b97a9f7e43d3756">rbegin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  <span class="keywordflow">return</span> std::make_reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a890b263fa86d948952ff06d0ea4fef5a">end</a>());</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  }</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span> </div><div class="line"><a name="l02619"></a><span class="lineno"><a class="line" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a21dda9562d93d0beafc260ee112beece"> 2619</a></span>  <span class="keyword">auto</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a21dda9562d93d0beafc260ee112beece">rend</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  <span class="keywordflow">return</span> std::make_reverse_iterator(<a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab8ea3c3a1f73a499fea4f6bbf871026c">begin</a>());</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  }</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span> </div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span> <span class="keyword">private</span>:</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  Range unitRange;</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> };</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span> </div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32></div><div class="line"><a name="l02629"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html"> 2629</a></span> <span class="keyword">struct </span><a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html">UnsafeUTFStringCodePointsAdaptor</a></div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span> #if <a class="code" href="platform_8h.html#a4c53610262c068e4d5201030f668d422">U_CPLUSPLUS_VERSION</a> >= 23 && __cpp_lib_ranges >= 2022<span class="stringliteral">'02 && \</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span> <span class="stringliteral"> __cpp_lib_bind_back >= 2022'</span>02 <span class="comment">// http://wg21.link/P2387R3.</span></div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  : std::ranges::range_adaptor_closure<UnsafeUTFStringCodePointsAdaptor<CP32>></div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span> {</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  <span class="keyword">template</span><<span class="keyword">typename</span> Range></div><div class="line"><a name="l02637"></a><span class="lineno"><a class="line" href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html#aa4d25256d05f9277032aca2732e8abb3"> 2637</a></span>  <span class="keyword">auto</span> <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html#aa4d25256d05f9277032aca2732e8abb3">operator()</a>(Range &&unitRange)<span class="keyword"> const </span>{</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span> <span class="preprocessor">#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 2021'10 // We need https://wg21.link/P2415R2.</span></div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints<CP32, std::ranges::views::all_t<Range></a>>(std::forward<Range>(unitRange));</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  <span class="keywordflow">if</span> constexpr (prv::is_basic_string_view_v<std::decay_t<Range>>) {</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <span class="comment">// Take basic_string_view by copy, not by reference. In C++20 this is handled by</span></div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  <span class="comment">// all_t<Range>, which is Range if Range is a view.</span></div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints<CP32, std::decay_t<Range></a>>(std::forward<Range>(unitRange));</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  <span class="keywordflow">return</span> <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">UnsafeUTFStringCodePoints<CP32, Range></a>(std::forward<Range>(unitRange));</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  }</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  }</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span> };</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span> </div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span> </div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span> <span class="keyword">template</span><<span class="keyword">typename</span> CP32></div><div class="line"><a name="l02666"></a><span class="lineno"><a class="line" href="utfiterator_8h.html#ae761307fb6f808f749d159a0203a7316"> 2666</a></span> constexpr <a class="code" href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html">UnsafeUTFStringCodePointsAdaptor<CP32></a> <a class="code" href="utfiterator_8h.html#ae761307fb6f808f749d159a0203a7316">unsafeUTFStringCodePoints</a>;</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span> </div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span> } <span class="comment">// namespace U_HEADER_ONLY_NAMESPACE</span></div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span> </div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span> </div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> <span class="preprocessor">#if defined(__cpp_lib_ranges)</span></div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CP32, UTFIllFormedBehavior behavior, <span class="keyword">typename</span> Range></div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> constexpr <span class="keywordtype">bool</span> std::ranges::enable_borrowed_range<</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints<CP32, behavior, Range></a>> =</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  std::ranges::enable_borrowed_range<Range>;</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span> </div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CP32, <span class="keyword">typename</span> Range></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span> constexpr <span class="keywordtype">bool</span> std::ranges::enable_borrowed_range<</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  <a class="code" href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints<CP32, Range></a>> =</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  std::ranges::enable_borrowed_range<Range>;</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span> </div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span> <span class="preprocessor">#endif // U_HIDE_DRAFT_API</span></div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span> <span class="preprocessor">#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API</span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span> <span class="preprocessor">#endif // __UTFITERATOR_H__</span></div><div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator</a></div><div class="ttdoc">Non-validating iterator over the code points in a Unicode string. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01960">utfiterator.h:1960</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ad6421355a9302ec59dad67d1a2b0ef81"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad6421355a9302ec59dad67d1a2b0ef81">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator++</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator operator++(int)</div><div class="ttdoc">Post-increment operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01322">utfiterator.h:1322</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a01325fac209af7af47f40d2764cdab09"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a01325fac209af7af47f40d2764cdab09">U_HEADER_ONLY_NAMESPACE::UTFIterator::UTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator()</div><div class="ttdoc">Default constructor. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01177">utfiterator.h:1177</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_ace4fc3dea27bd52519e66e0c0cc4fd8f"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ace4fc3dea27bd52519e66e0c0cc4fd8f">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE bool operator==(const UnsafeUTFIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02022">utfiterator.h:2022</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_a7a3611aefc4ffc6aabb7dd127baff164"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a7a3611aefc4ffc6aabb7dd127baff164">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::operator!=</a></div><div class="ttdeci">bool operator!=(const CodePointsIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00267">utfiterator.h:267</a></div></div> <div class="ttc" id="utf8_8h_html_adb9837ea38dd811524a5b761ddc2a2ca"><div class="ttname"><a href="utf8_8h.html#adb9837ea38dd811524a5b761ddc2a2ca">U8_IS_LEAD</a></div><div class="ttdeci">#define U8_IS_LEAD(c)</div><div class="ttdoc">Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4) </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00181">utf8.h:181</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints</a></div><div class="ttdoc">A C++ "range" for validating iteration over all of the code points of a code unit range...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01785">utfiterator.h:1785</a></div></div> <div class="ttc" id="utfiterator_8h_html_a5296d8e44f40e0d0971832c9897437cb"><div class="ttname"><a href="utfiterator_8h.html#a5296d8e44f40e0d0971832c9897437cb">U_HEADER_ONLY_NAMESPACE::prv::is_basic_string_view_v</a></div><div class="ttdeci">constexpr bool is_basic_string_view_v</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00244">utfiterator.h:244</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a7d0a3b431701d67f3ae8d9969f0411ef"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a7d0a3b431701d67f3ae8d9969f0411ef">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator--</a></div><div class="ttdeci">U_FORCE_INLINE std::enable_if_t< prv::bidirectional_iterator< Iter >, UnsafeUTFIterator > operator--(int)</div><div class="ttdoc">Post-decrement operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02196">utfiterator.h:2196</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ac4dfa33735e8be9e85912602712015c3"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac4dfa33735e8be9e85912602712015c3">U_HEADER_ONLY_NAMESPACE::UTFIterator::UTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator(UnitIter start, UnitIter p, LimitIter limit)</div><div class="ttdoc">Constructor with start <= p < limit. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01145">utfiterator.h:1145</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a84efe07c5b19f6bbfaf6902a30502a9f"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a84efe07c5b19f6bbfaf6902a30502a9f">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator-></a></div><div class="ttdeci">U_FORCE_INLINE Proxy operator->() const</div><div class="ttdoc">Decodes the code unit sequence at the current position. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02107">utfiterator.h:2107</a></div></div> <div class="ttc" id="namespaceicu_html_a8d8f68e93f4a83a227b82cec7745dff6"><div class="ttname"><a href="namespaceicu.html#a8d8f68e93f4a83a227b82cec7745dff6">icu::operator!=</a></div><div class="ttdeci">bool operator!=(const StringPiece &x, const StringPiece &y)</div><div class="ttdoc">Global operator != for StringPiece. </div><div class="ttdef"><b>Definition:</b> <a href="stringpiece_8h_source.html#l00346">stringpiece.h:346</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_ac93610fe9801bd44f674da0e20b41135"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ac93610fe9801bd44f674da0e20b41135">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::length</a></div><div class="ttdeci">uint8_t length() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00407">utfiterator.h:407</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_af3e7a9b7939a3ddf638d6868917a2c4b"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#af3e7a9b7939a3ddf638d6868917a2c4b">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::operator=</a></div><div class="ttdeci">UnsafeUTFStringCodePoints & operator=(const UnsafeUTFStringCodePoints &other)=default</div><div class="ttdoc">Copy assignment operator. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_ad7de01ae4c9a184a2c6d7d02f3cea3f4"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ad7de01ae4c9a184a2c6d7d02f3cea3f4">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator=</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeUTFIterator & operator=(UnsafeUTFIterator &&src) noexcept=default</div><div class="ttdoc">Move assignment operator. </div></div> <div class="ttc" id="utf8_8h_html_ae8ed1045986b8bf27814e9bc78388961"><div class="ttname"><a href="utf8_8h.html#ae8ed1045986b8bf27814e9bc78388961">U8_MASK_LEAD_BYTE</a></div><div class="ttdeci">#define U8_MASK_LEAD_BYTE(leadByte, countTrailBytes)</div><div class="ttdoc">Mask a UTF-8 lead byte, leave only the lower bits that form part of the code point value...</div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00081">utf8.h:81</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_ac4b3686f14ab781f3b21cf9427135bd7"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4b3686f14ab781f3b21cf9427135bd7">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::UnsafeUTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeUTFIterator(UnitIter p)</div><div class="ttdoc">Constructor; the iterator/pointer should be at a code point boundary. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01999">utfiterator.h:1999</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_afd38b3b357996c6ca48f770d75f9e88e"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#afd38b3b357996c6ca48f770d75f9e88e">U_HEADER_ONLY_NAMESPACE::UTFIterator::difference_type</a></div><div class="ttdeci">prv::iter_difference_t< UnitIter > difference_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01125">utfiterator.h:1125</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ab36e2322d082d7d53bd91c1a9a3c4dbd"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab36e2322d082d7d53bd91c1a9a3c4dbd">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator!=(const Sentinel &s, const UTFIterator &iter)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01259">utfiterator.h:1259</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_aeeac0ee59c91d65411130686cc9622af"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#aeeac0ee59c91d65411130686cc9622af">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::end</a></div><div class="ttdeci">auto end() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01858">utfiterator.h:1858</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d"><div class="ttname"><a href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a2e9b1ff0326a69017ff1ea55c9d7137d">UTF_BEHAVIOR_FFFD</a></div><div class="ttdoc">Returns U+FFFD Replacement Character. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00159">utfiterator.h:159</a></div></div> <div class="ttc" id="namespaceicu_html_a5e840c3254f3b18f2b2f2662b8495d52"><div class="ttname"><a href="namespaceicu.html#a5e840c3254f3b18f2b2f2662b8495d52">icu::operator==</a></div><div class="ttdeci">U_COMMON_API UBool operator==(const StringPiece &x, const StringPiece &y)</div><div class="ttdoc">Global operator == for StringPiece. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_af8278209cf3ab67425453d254e3e5e6e"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#af8278209cf3ab67425453d254e3e5e6e">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::pointer</a></div><div class="ttdeci">CP32 * pointer</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00256">utfiterator.h:256</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a23f9e0a7fe8610bae1ea89641d3da566"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23f9e0a7fe8610bae1ea89641d3da566">U_HEADER_ONLY_NAMESPACE::UTFIterator::reference</a></div><div class="ttdeci">value_type reference</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01121">utfiterator.h:1121</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a296417432d1a0f534691f61c42e82287"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a296417432d1a0f534691f61c42e82287">U_HEADER_ONLY_NAMESPACE::UTFIterator::value_type</a></div><div class="ttdeci">CodeUnits< CP32, UnitIter > value_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01119">utfiterator.h:1119</a></div></div> <div class="ttc" id="utfiterator_8h_html_a984a43b6a404be5a37425475b5992285"><div class="ttname"><a href="utfiterator_8h.html#a984a43b6a404be5a37425475b5992285">U_HEADER_ONLY_NAMESPACE::utfStringCodePoints</a></div><div class="ttdeci">constexpr UTFStringCodePointsAdaptor< CP32, behavior > utfStringCodePoints</div><div class="ttdoc">Range adaptor function object returning a UTFStringCodePoints object that represents a "range" of cod...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01934">utfiterator.h:1934</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints_html_a91420451bc04e2d51e228a982b7701ff"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a91420451bc04e2d51e228a982b7701ff">U_HEADER_ONLY_NAMESPACE::AllCodePoints::AllCodePoints</a></div><div class="ttdeci">AllCodePoints()</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00306">utfiterator.h:306</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_a631f701995e513bdd405a53d69a7c5b2"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a631f701995e513bdd405a53d69a7c5b2">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::difference_type</a></div><div class="ttdeci">int32_t difference_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00258">utfiterator.h:258</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_aefda995f3082028d6b97a9f7e43d3756"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aefda995f3082028d6b97a9f7e43d3756">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::rbegin</a></div><div class="ttdeci">auto rbegin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02611">utfiterator.h:2611</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_abde3a7ca743e5befec51d3befd7363be"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abde3a7ca743e5befec51d3befd7363be">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator--</a></div><div class="ttdeci">U_FORCE_INLINE std::enable_if_t< prv::bidirectional_iterator< Iter >, UTFIterator & > operator--()</div><div class="ttdoc">Pre-decrement operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01354">utfiterator.h:1354</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_abfee62ae5aa6425ad43507ece45d5aa1"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#abfee62ae5aa6425ad43507ece45d5aa1">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE bool operator!=(const UTFIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01202">utfiterator.h:1202</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_aca3cdb7073d0401cc80bfe1e1710919e"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aca3cdb7073d0401cc80bfe1e1710919e">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::iterator_category</a></div><div class="ttdeci">std::forward_iterator_tag iterator_category</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00260">utfiterator.h:260</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_ac4a7fa17145953496a18d1ddecbaa31a"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac4a7fa17145953496a18d1ddecbaa31a">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator++</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeUTFIterator & operator++()</div><div class="ttdoc">Pre-increment operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02122">utfiterator.h:2122</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_a126a1bacc34a290a079d2676031db019"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a126a1bacc34a290a079d2676031db019">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::stringView</a></div><div class="ttdeci">std::enable_if_t< std::is_pointer_v< Iter >||std::is_same_v< Iter, typename std::basic_string< Unit >::iterator >||std::is_same_v< Iter, typename std::basic_string< Unit >::const_iterator >||std::is_same_v< Iter, typename std::basic_string_view< Unit >::iterator >||std::is_same_v< Iter, typename std::basic_string_view< Unit >::const_iterator >, std::basic_string_view< Unit > > stringView() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00432">utfiterator.h:432</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits_html_abfa83bc84657e36ec5efb73ed3182a62"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#abfa83bc84657e36ec5efb73ed3182a62">U_HEADER_ONLY_NAMESPACE::CodeUnits::CodeUnits</a></div><div class="ttdeci">CodeUnits(CP32 codePoint, uint8_t length, bool wellFormed, UnitIter start, UnitIter limit)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00490">utfiterator.h:490</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints_html_afae16d4e58f0fb76a9a98cb43939ebca"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#afae16d4e58f0fb76a9a98cb43939ebca">U_HEADER_ONLY_NAMESPACE::AllCodePoints::end</a></div><div class="ttdeci">auto end() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00317">utfiterator.h:317</a></div></div> <div class="ttc" id="utf8_8h_html_a8f3a9427d880458a9fa6b169a3cc1b3c"><div class="ttname"><a href="utf8_8h.html#a8f3a9427d880458a9fa6b169a3cc1b3c">U8_IS_SINGLE</a></div><div class="ttdeci">#define U8_IS_SINGLE(c)</div><div class="ttdoc">Does this code unit (byte) encode a code point by itself (US-ASCII 0..0x7f)? </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00173">utf8.h:173</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a8d24d3902f047ac09e5d720fdd28fbbb"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a8d24d3902f047ac09e5d720fdd28fbbb">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::operator=</a></div><div class="ttdeci">UTFStringCodePoints & operator=(const UTFStringCodePoints &other)=default</div><div class="ttdoc">Copy assignment operator. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a23fa36a3842fee500146570b36c08ee6"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a23fa36a3842fee500146570b36c08ee6">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator=</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator & operator=(UTFIterator &&src) noexcept=default</div><div class="ttdoc">Move assignment operator. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a32e210208304c554b478f57f4b6636e4"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a32e210208304c554b478f57f4b6636e4">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UnsafeUTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator==(const UnsafeUTFIterator &iter, const Sentinel &s)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02042">utfiterator.h:2042</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues_html_ae4b896b78551bb1a937e3ac3acf5c279"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#ae4b896b78551bb1a937e3ac3acf5c279">U_HEADER_ONLY_NAMESPACE::AllScalarValues::end</a></div><div class="ttdeci">auto end() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00348">utfiterator.h:348</a></div></div> <div class="ttc" id="utf16_8h_html_a6e141a548138e8c24822d219b7e06cb4"><div class="ttname"><a href="utf16_8h.html#a6e141a548138e8c24822d219b7e06cb4">U16_IS_SURROGATE_LEAD</a></div><div class="ttdeci">#define U16_IS_SURROGATE_LEAD(c)</div><div class="ttdoc">Assuming c is a surrogate code point (U16_IS_SURROGATE(c)), is it a lead surrogate? </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00084">utf16.h:84</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_aa7246527f695058d8cd0b29a74d0e5ee"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa7246527f695058d8cd0b29a74d0e5ee">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::operator*</a></div><div class="ttdeci">CP32 operator*() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00269">utfiterator.h:269</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56"><div class="ttname"><a href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a36d5d4b43747b3b7230fcd82daf8fb56">UTF_BEHAVIOR_SURROGATE</a></div><div class="ttdoc">UTF-8: Not allowed; UTF-16: returns the unpaired surrogate; UTF-32: returns the surrogate code point...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00167">utfiterator.h:167</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_aa70b84fe2b967f700dc87970d0a9d95e"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#aa70b84fe2b967f700dc87970d0a9d95e">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::reference</a></div><div class="ttdeci">value_type reference</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00254">utfiterator.h:254</a></div></div> <div class="ttc" id="utfiterator_8h_html_a0173fdd0ff9c634956e829eaa5794465"><div class="ttname"><a href="utfiterator_8h.html#a0173fdd0ff9c634956e829eaa5794465">U_HEADER_ONLY_NAMESPACE::unsafeUTFIterator</a></div><div class="ttdeci">auto unsafeUTFIterator(UnitIter iter)</div><div class="ttdoc">UnsafeUTFIterator factory function. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02494">utfiterator.h:2494</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a7c9f027fcb3bfa432508f4653fe2fc5c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a7c9f027fcb3bfa432508f4653fe2fc5c">U_HEADER_ONLY_NAMESPACE::UTFIterator::iterator_category</a></div><div class="ttdeci">std::conditional_t< prv::bidirectional_iterator< UnitIter >, std::bidirectional_iterator_tag, std::forward_iterator_tag > iterator_category</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01130">utfiterator.h:1130</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00248">utfiterator.h:248</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html">U_HEADER_ONLY_NAMESPACE::UTFIterator</a></div><div class="ttdoc">Validating iterator over the code points in a Unicode string. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01102">utfiterator.h:1102</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html">U_HEADER_ONLY_NAMESPACE::AllScalarValues</a></div><div class="ttdoc">A C++ "range" over all Unicode scalar values U+0000..U+D7FF & U+E000..U+10FFFF. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00333">utfiterator.h:333</a></div></div> <div class="ttc" id="uversion_8h_html"><div class="ttname"><a href="uversion_8h.html">uversion.h</a></div><div class="ttdoc">C API: API for accessing ICU version numbers. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_a890b263fa86d948952ff06d0ea4fef5a"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a890b263fa86d948952ff06d0ea4fef5a">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::end</a></div><div class="ttdeci">auto end()</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02580">utfiterator.h:2580</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a9f0ca4d36cadad862a78ca4ca18caae7"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a9f0ca4d36cadad862a78ca4ca18caae7">U_HEADER_ONLY_NAMESPACE::UTFIterator::UTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator(UnitIter p)</div><div class="ttdoc">Constructs an iterator start or limit sentinel. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01171">utfiterator.h:1171</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_aa510b2d851f688325057482bdcfbda3a"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa510b2d851f688325057482bdcfbda3a">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::end</a></div><div class="ttdeci">UnitIter end() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00401">utfiterator.h:401</a></div></div> <div class="ttc" id="utfiterator_8h_html_ac94512354a3c3757bd51504e17c42675"><div class="ttname"><a href="utfiterator_8h.html#ac94512354a3c3757bd51504e17c42675">U_HEADER_ONLY_NAMESPACE::prv::iter_value_t</a></div><div class="ttdeci">typename std::iterator_traits< Iter >::value_type iter_value_t</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00199">utfiterator.h:199</a></div></div> <div class="ttc" id="utf16_8h_html_ace839ae31a801fd9c53fa67c5f8b9144"><div class="ttname"><a href="utf16_8h.html#ace839ae31a801fd9c53fa67c5f8b9144">U16_IS_LEAD</a></div><div class="ttdeci">#define U16_IS_LEAD(c)</div><div class="ttdoc">Is this code unit a lead surrogate (U+d800..U+dbff)? </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00059">utf16.h:59</a></div></div> <div class="ttc" id="utf8_8h_html"><div class="ttname"><a href="utf8_8h.html">utf8.h</a></div><div class="ttdoc">C API: 8-bit Unicode handling macros. </div></div> <div class="ttc" id="utf16_8h_html_afe8d9f450b9297897f018c2f23eb0724"><div class="ttname"><a href="utf16_8h.html#afe8d9f450b9297897f018c2f23eb0724">U16_IS_TRAIL</a></div><div class="ttdeci">#define U16_IS_TRAIL(c)</div><div class="ttdoc">Is this code unit a trail surrogate (U+dc00..U+dfff)? </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00067">utf16.h:67</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a2685693ce7d99d1b3eb4b80fc4ef81ec"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2685693ce7d99d1b3eb4b80fc4ef81ec">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UnsafeUTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator!=(const UnsafeUTFIterator &iter, const Sentinel &s)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02070">utfiterator.h:2070</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a38a8e605c0ba127da652dca32163be88"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a38a8e605c0ba127da652dca32163be88">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::UTFStringCodePoints</a></div><div class="ttdeci">UTFStringCodePoints()=default</div><div class="ttdoc">Constructs an empty C++ "range" object. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a533834dbbfc4c2c82f8ee6d7fa04b182"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a533834dbbfc4c2c82f8ee6d7fa04b182">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::rend</a></div><div class="ttdeci">auto rend() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01884">utfiterator.h:1884</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits_html_a3afb339a6b661fbf25dcef52c6fb1764"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a3afb339a6b661fbf25dcef52c6fb1764">U_HEADER_ONLY_NAMESPACE::CodeUnits::operator=</a></div><div class="ttdeci">CodeUnits & operator=(const CodeUnits &other)=default</div><div class="ttdoc">Copy assignment operator. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a076c9200f66eda495570d16a0069cc7f"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a076c9200f66eda495570d16a0069cc7f">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::UnsafeUTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeUTFIterator()</div><div class="ttdoc">Default constructor. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02005">utfiterator.h:2005</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_ad13250ea35651622d55c192832b3fe68"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ad13250ea35651622d55c192832b3fe68">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::operator++</a></div><div class="ttdeci">CodePointsIterator operator++(int)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00279">utfiterator.h:279</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a2561ce55cd228df3188a6c5720ee2b01"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2561ce55cd228df3188a6c5720ee2b01">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::reference</a></div><div class="ttdeci">value_type reference</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01979">utfiterator.h:1979</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a2f65e0ed36ee6309ec77e35a865cd0aa"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a2f65e0ed36ee6309ec77e35a865cd0aa">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::begin</a></div><div class="ttdeci">auto begin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01831">utfiterator.h:1831</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor_html"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePointsAdaptor</a></div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02629">utfiterator.h:2629</a></div></div> <div class="ttc" id="utf16_8h_html_ac1deffbf1956d9fe696129515e88f006"><div class="ttname"><a href="utf16_8h.html#ac1deffbf1956d9fe696129515e88f006">U16_GET_SUPPLEMENTARY</a></div><div class="ttdeci">#define U16_GET_SUPPLEMENTARY(lead, trail)</div><div class="ttdoc">Get a supplementary code point value (U+10000..U+10ffff) from its lead and trail surrogates. </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00112">utf16.h:112</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_a75374787c5ee548a7a9bc334b0632ef5"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#a75374787c5ee548a7a9bc334b0632ef5">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::begin</a></div><div class="ttdeci">UnitIter begin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00394">utfiterator.h:394</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a08962fca97cf34b32f2fe94416a9cedf"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a08962fca97cf34b32f2fe94416a9cedf">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::value_type</a></div><div class="ttdeci">UnsafeCodeUnits< CP32, UnitIter > value_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01977">utfiterator.h:1977</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ac072a8a799042be68af0e5bdfff2d5ac"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ac072a8a799042be68af0e5bdfff2d5ac">U_HEADER_ONLY_NAMESPACE::UTFIterator::pointer</a></div><div class="ttdeci">Proxy pointer</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01123">utfiterator.h:1123</a></div></div> <div class="ttc" id="utf8_8h_html_afed9fc9bf480bf15a2e6051774f2d80e"><div class="ttname"><a href="utf8_8h.html#afed9fc9bf480bf15a2e6051774f2d80e">U8_IS_TRAIL</a></div><div class="ttdeci">#define U8_IS_TRAIL(c)</div><div class="ttdoc">Is this code unit (byte) a UTF-8 trail byte? (0x80..0xBF) </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00190">utf8.h:190</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_a21dda9562d93d0beafc260ee112beece"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a21dda9562d93d0beafc260ee112beece">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::rend</a></div><div class="ttdeci">auto rend() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02619">utfiterator.h:2619</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_abaca95cc01fa7f8f557c30983d75dade"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#abaca95cc01fa7f8f557c30983d75dade">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::CodePointsIterator</a></div><div class="ttdeci">CodePointsIterator(CP32 c)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00263">utfiterator.h:263</a></div></div> <div class="ttc" id="umachine_8h_html_a807436737b76a72b76ddf0b900304b4a"><div class="ttname"><a href="umachine_8h.html#a807436737b76a72b76ddf0b900304b4a">U_SENTINEL</a></div><div class="ttdeci">#define U_SENTINEL</div><div class="ttdoc">This value is intended for sentinel values for APIs that (take or) return single code points (UChar32...</div><div class="ttdef"><b>Definition:</b> <a href="umachine_8h_source.html#l00469">umachine.h:469</a></div></div> <div class="ttc" id="utf8_8h_html_ab7b00ab82ca3e89d24c4088b2b4e9416"><div class="ttname"><a href="utf8_8h.html#ab7b00ab82ca3e89d24c4088b2b4e9416">U8_LEAD4_T1_BITS</a></div><div class="ttdeci">#define U8_LEAD4_T1_BITS</div><div class="ttdoc">Internal bit vector for 4-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD4_AND_T1. </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00108">utf8.h:108</a></div></div> <div class="ttc" id="utf16_8h_html_a1da8c1409deafe3ac32a8ab506086c10"><div class="ttname"><a href="utf16_8h.html#a1da8c1409deafe3ac32a8ab506086c10">U16_IS_SURROGATE_TRAIL</a></div><div class="ttdeci">#define U16_IS_SURROGATE_TRAIL(c)</div><div class="ttdoc">Assuming c is a surrogate code point (U16_IS_SURROGATE(c)), is it a trail surrogate? </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00093">utf16.h:93</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a93bef215aeb1aec47030f9882cca909f"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a93bef215aeb1aec47030f9882cca909f">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::end</a></div><div class="ttdeci">auto end()</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01839">utfiterator.h:1839</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_ac13c7af05f6d185903ad18ea669fdfb4"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ac13c7af05f6d185903ad18ea669fdfb4">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::operator++</a></div><div class="ttdeci">CodePointsIterator & operator++()</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00271">utfiterator.h:271</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type_html"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1range__type.html">U_HEADER_ONLY_NAMESPACE::prv::range_type</a></div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00221">utfiterator.h:221</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a6520a007dff4671d9e405e628e4f59e1"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a6520a007dff4671d9e405e628e4f59e1">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::difference_type</a></div><div class="ttdeci">prv::iter_difference_t< UnitIter > difference_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01983">utfiterator.h:1983</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view_html"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1prv_1_1is__basic__string__view.html">U_HEADER_ONLY_NAMESPACE::prv::is_basic_string_view</a></div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00237">utfiterator.h:237</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a2ac94c1a5fcc6b187558fa284e46208b"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2ac94c1a5fcc6b187558fa284e46208b">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::iterator_category</a></div><div class="ttdeci">std::conditional_t< prv::bidirectional_iterator< UnitIter >, std::bidirectional_iterator_tag, std::forward_iterator_tag > iterator_category</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01988">utfiterator.h:1988</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a1f3f5dfda3c2647d4c55c68cda916935"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a1f3f5dfda3c2647d4c55c68cda916935">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator-></a></div><div class="ttdeci">U_FORCE_INLINE Proxy operator->() const</div><div class="ttdoc">Decodes the code unit sequence at the current position. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01285">utfiterator.h:1285</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a0f87972c82d00bad66715546edddd501"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a0f87972c82d00bad66715546edddd501">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator==(const Sentinel &s, const UTFIterator &iter)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01235">utfiterator.h:1235</a></div></div> <div class="ttc" id="utf8_8h_html_a3a06eab6584d228ea835b424e0591aec"><div class="ttname"><a href="utf8_8h.html#a3a06eab6584d228ea835b424e0591aec">U8_IS_VALID_LEAD3_AND_T1</a></div><div class="ttdeci">#define U8_IS_VALID_LEAD3_AND_T1(lead, t1)</div><div class="ttdoc">Internal 3-byte UTF-8 validity check. </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00098">utf8.h:98</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues_html_a968bba6c052a579970d2d7938b4ef4d6"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#a968bba6c052a579970d2d7938b4ef4d6">U_HEADER_ONLY_NAMESPACE::AllScalarValues::begin</a></div><div class="ttdeci">auto begin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00343">utfiterator.h:343</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae75399e99d2481183124f5f96b19b9e1"><div class="ttname"><a href="utfiterator_8h.html#ae75399e99d2481183124f5f96b19b9e1">U_HEADER_ONLY_NAMESPACE::prv::bidirectional_iterator</a></div><div class="ttdeci">constexpr bool bidirectional_iterator</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00214">utfiterator.h:214</a></div></div> <div class="ttc" id="utfiterator_8h_html_a379c0d1e14b3a9a7e7ca33899d8fda6b"><div class="ttname"><a href="utfiterator_8h.html#a379c0d1e14b3a9a7e7ca33899d8fda6b">U_HEADER_ONLY_NAMESPACE::prv::iter_difference_t</a></div><div class="ttdeci">typename std::iterator_traits< Iter >::difference_type iter_difference_t</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00203">utfiterator.h:203</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_ab311f079480af0344112a49dd6b055de"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab311f079480af0344112a49dd6b055de">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::UnsafeCodeUnits</a></div><div class="ttdeci">UnsafeCodeUnits(CP32 codePoint, uint8_t length, UnitIter start, UnitIter limit)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00372">utfiterator.h:372</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a35839f3b250161748e6681dc79301fd9"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a35839f3b250161748e6681dc79301fd9">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::begin</a></div><div class="ttdeci">auto begin()</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01822">utfiterator.h:1822</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits_html_a103be5cb1976eec786eb787e7ecd0f0f"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html#a103be5cb1976eec786eb787e7ecd0f0f">U_HEADER_ONLY_NAMESPACE::CodeUnits::wellFormed</a></div><div class="ttdeci">bool wellFormed() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00502">utfiterator.h:502</a></div></div> <div class="ttc" id="utf16_8h_html"><div class="ttname"><a href="utf16_8h.html">utf16.h</a></div><div class="ttdoc">C API: 16-bit Unicode handling macros. </div></div> <div class="ttc" id="namespaceU__HEADER__ONLY__NAMESPACE_html"><div class="ttname"><a href="namespaceU__HEADER__ONLY__NAMESPACE.html">U_HEADER_ONLY_NAMESPACE</a></div><div class="ttdef"><b>Definition:</b> <a href="uset_8h_source.html#l01327">uset.h:1327</a></div></div> <div class="ttc" id="utf8_8h_html_aabfe8ee746b8025ec80ed1977e8ae3c6"><div class="ttname"><a href="utf8_8h.html#aabfe8ee746b8025ec80ed1977e8ae3c6">U8_LEAD3_T1_BITS</a></div><div class="ttdeci">#define U8_LEAD3_T1_BITS</div><div class="ttdoc">Internal bit vector for 3-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD3_AND_T1. </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00091">utf8.h:91</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor_html_aa4d25256d05f9277032aca2732e8abb3"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePointsAdaptor.html#aa4d25256d05f9277032aca2732e8abb3">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePointsAdaptor::operator()</a></div><div class="ttdeci">auto operator()(Range &&unitRange) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02637">utfiterator.h:2637</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0"><div class="ttname"><a href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46a3a3ec2a3f0723ec5bc20765b895509f0">UTF_BEHAVIOR_NEGATIVE</a></div><div class="ttdoc">Returns a negative value (-1=U_SENTINEL) instead of a code point. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00157">utfiterator.h:157</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_ac87cb4ff66ba9495a6ad4c75630cc0e6"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ac87cb4ff66ba9495a6ad4c75630cc0e6">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::UnsafeUTFStringCodePoints</a></div><div class="ttdeci">UnsafeUTFStringCodePoints(Range unitRange)</div><div class="ttdoc">Constructs a C++ "range" object over the code points in the string. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02541">utfiterator.h:2541</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_aea325c59db112a20e4c3e66a1e22078c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#aea325c59db112a20e4c3e66a1e22078c">U_HEADER_ONLY_NAMESPACE::UTFIterator::UTFIterator</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator(UnitIter p, LimitIter limit)</div><div class="ttdoc">Constructor with start == p < limit. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01158">utfiterator.h:1158</a></div></div> <div class="ttc" id="utfiterator_8h_html_afb839c10d925301c6dad1daeb23be6d0"><div class="ttname"><a href="utfiterator_8h.html#afb839c10d925301c6dad1daeb23be6d0">U_HEADER_ONLY_NAMESPACE::prv::range</a></div><div class="ttdeci">constexpr bool range</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00232">utfiterator.h:232</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_ab2a26ededc56064f8474619e4ae3f87b"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab2a26ededc56064f8474619e4ae3f87b">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::begin</a></div><div class="ttdeci">auto begin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02572">utfiterator.h:2572</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a5f9ce5ada172cc48285bb744578fed19"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a5f9ce5ada172cc48285bb744578fed19">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator!=(const UTFIterator &iter, const Sentinel &s)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01248">utfiterator.h:1248</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_a64f6da9ed7725cd46064a4a10279cd51"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#a64f6da9ed7725cd46064a4a10279cd51">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::operator==</a></div><div class="ttdeci">bool operator==(const CodePointsIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00265">utfiterator.h:265</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_adce9b528fc416ae4cb952361b06dad81"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#adce9b528fc416ae4cb952361b06dad81">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::UTFStringCodePoints</a></div><div class="ttdeci">UTFStringCodePoints(Range unitRange)</div><div class="ttdoc">Constructs a C++ "range" object over the code points in the string, keeping a reference to the code u...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01810">utfiterator.h:1810</a></div></div> <div class="ttc" id="utfiterator_8h_html_a603cf1c4c624736f3965c0dae31a5c79"><div class="ttname"><a href="utfiterator_8h.html#a603cf1c4c624736f3965c0dae31a5c79">U_HEADER_ONLY_NAMESPACE::prv::forward_iterator</a></div><div class="ttdeci">constexpr bool forward_iterator</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00207">utfiterator.h:207</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits</a></div><div class="ttdoc">Result of decoding a code unit sequence for one code point. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00367">utfiterator.h:367</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a8ed567739d14c82bcfa2563ea2d9b433"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a8ed567739d14c82bcfa2563ea2d9b433">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator++</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeUTFIterator operator++(int)</div><div class="ttdoc">Post-increment operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02144">utfiterator.h:2144</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae96b61b479fe4d7b8e525787353d1d46"><div class="ttname"><a href="utfiterator_8h.html#ae96b61b479fe4d7b8e525787353d1d46">UTFIllFormedBehavior</a></div><div class="ttdeci">UTFIllFormedBehavior</div><div class="ttdoc">Some defined behaviors for handling ill-formed Unicode strings. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00149">utfiterator.h:149</a></div></div> <div class="ttc" id="utfiterator_8h_html_a81f9f64c82a3b29389483be3c65c581d"><div class="ttname"><a href="utfiterator_8h.html#a81f9f64c82a3b29389483be3c65c581d">U_HEADER_ONLY_NAMESPACE::utfIterator</a></div><div class="ttdeci">auto utfIterator(UnitIter start, UnitIter p, LimitIter limit)</div><div class="ttdoc">UTFIterator factory function for start <= p < limit. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01696">utfiterator.h:1696</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_a61647c372561076f02aeb15b78161bd9"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#a61647c372561076f02aeb15b78161bd9">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::UnsafeUTFStringCodePoints</a></div><div class="ttdeci">UnsafeUTFStringCodePoints(Range unitRange)</div><div class="ttdoc">Constructs a C++ "range" object over the code points in the string, keeping a reference to the code u...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02551">utfiterator.h:2551</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor_html_adb7e33cc0b4a4a6ad934e29a367e157d"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html#adb7e33cc0b4a4a6ad934e29a367e157d">U_HEADER_ONLY_NAMESPACE::UTFStringCodePointsAdaptor::operator()</a></div><div class="ttdeci">auto operator()(Range &&unitRange) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01902">utfiterator.h:1902</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ad40050602994804e9ab9fc4ecea655ab"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad40050602994804e9ab9fc4ecea655ab">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator*</a></div><div class="ttdeci">U_FORCE_INLINE CodeUnits< CP32, UnitIter > operator*() const</div><div class="ttdoc">Decodes the code unit sequence at the current position. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01268">utfiterator.h:1268</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1CodeUnits.html">U_HEADER_ONLY_NAMESPACE::CodeUnits</a></div><div class="ttdoc">Result of validating and decoding a code unit sequence for one code point. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00487">utfiterator.h:487</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a8f374862db7701a9cf7683bf5a76e464"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a8f374862db7701a9cf7683bf5a76e464">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::UTFStringCodePoints</a></div><div class="ttdeci">UTFStringCodePoints(Range unitRange)</div><div class="ttdoc">Constructs a C++ "range" object over the code points in the string. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01800">utfiterator.h:1800</a></div></div> <div class="ttc" id="utfiterator_8h_html_ae761307fb6f808f749d159a0203a7316"><div class="ttname"><a href="utfiterator_8h.html#ae761307fb6f808f749d159a0203a7316">U_HEADER_ONLY_NAMESPACE::unsafeUTFStringCodePoints</a></div><div class="ttdeci">constexpr UnsafeUTFStringCodePointsAdaptor< CP32 > unsafeUTFStringCodePoints</div><div class="ttdoc">Range adaptor function object returning an UnsafeUTFStringCodePoints object that represents a "range"...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02666">utfiterator.h:2666</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_aed2bb49df2e0289fd7444ff0bf942cb3"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aed2bb49df2e0289fd7444ff0bf942cb3">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::end</a></div><div class="ttdeci">auto end() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02596">utfiterator.h:2596</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_aa600c9ab6d26f0f005de9b49300a21d5"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#aa600c9ab6d26f0f005de9b49300a21d5">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::UnsafeUTFStringCodePoints</a></div><div class="ttdeci">UnsafeUTFStringCodePoints()=default</div><div class="ttdoc">Constructs an empty C++ "range" object. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ae800bd103c0c1d1b08c4503faf5adc68"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ae800bd103c0c1d1b08c4503faf5adc68">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE bool operator==(const UTFIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01194">utfiterator.h:1194</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a0aafb811ad119e9badeb417d980483b0"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a0aafb811ad119e9badeb417d980483b0">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE bool operator!=(const UnsafeUTFIterator &other) const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02030">utfiterator.h:2030</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator_html_ab7f61b32d221876c2a30c14033f43900"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1prv_1_1CodePointsIterator.html#ab7f61b32d221876c2a30c14033f43900">U_HEADER_ONLY_NAMESPACE::prv::CodePointsIterator::value_type</a></div><div class="ttdeci">CP32 value_type</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00252">utfiterator.h:252</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ab53349a772a848214fa5f83cc74030e4"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ab53349a772a848214fa5f83cc74030e4">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator==(const UTFIterator &iter, const Sentinel &s)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01216">utfiterator.h:1216</a></div></div> <div class="ttc" id="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor_html"><div class="ttname"><a href="structU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePointsAdaptor.html">U_HEADER_ONLY_NAMESPACE::UTFStringCodePointsAdaptor</a></div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01894">utfiterator.h:1894</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints_html_a1a65524403cc16fe608a5a70a84216ab"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html#a1a65524403cc16fe608a5a70a84216ab">U_HEADER_ONLY_NAMESPACE::AllCodePoints::begin</a></div><div class="ttdeci">auto begin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00312">utfiterator.h:312</a></div></div> <div class="ttc" id="utf8_8h_html_a5525576b42e8b7b4240153d9403c47a2"><div class="ttname"><a href="utf8_8h.html#a5525576b42e8b7b4240153d9403c47a2">U8_IS_VALID_LEAD4_AND_T1</a></div><div class="ttdeci">#define U8_IS_VALID_LEAD4_AND_T1(lead, t1)</div><div class="ttdoc">Internal 4-byte UTF-8 validity check. </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00115">utf8.h:115</a></div></div> <div class="ttc" id="utypes_8h_html"><div class="ttname"><a href="utypes_8h.html">utypes.h</a></div><div class="ttdoc">Basic definitions for ICU, for both C and C++ APIs. </div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllCodePoints.html">U_HEADER_ONLY_NAMESPACE::AllCodePoints</a></div><div class="ttdoc">A C++ "range" over all Unicode code points U+0000..U+10FFFF. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00302">utfiterator.h:302</a></div></div> <div class="ttc" id="utf16_8h_html_ac25b589c0c9b60160d357770fad39cea"><div class="ttname"><a href="utf16_8h.html#ac25b589c0c9b60160d357770fad39cea">U16_IS_SURROGATE</a></div><div class="ttdeci">#define U16_IS_SURROGATE(c)</div><div class="ttdoc">Is this code unit a surrogate (U+d800..U+dfff)? </div><div class="ttdef"><b>Definition:</b> <a href="utf16_8h_source.html#l00075">utf16.h:75</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a05a8fa613ee2c918167c9b6f01ccf8c0"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a05a8fa613ee2c918167c9b6f01ccf8c0">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator==</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UnsafeUTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator==(const Sentinel &s, const UnsafeUTFIterator &iter)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02057">utfiterator.h:2057</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints_html_a6142c66a710573f593626da46f62270c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFStringCodePoints.html#a6142c66a710573f593626da46f62270c">U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints::rbegin</a></div><div class="ttdeci">auto rbegin() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01876">utfiterator.h:1876</a></div></div> <div class="ttc" id="platform_8h_html_a4c53610262c068e4d5201030f668d422"><div class="ttname"><a href="platform_8h.html#a4c53610262c068e4d5201030f668d422">U_CPLUSPLUS_VERSION</a></div><div class="ttdeci">#define U_CPLUSPLUS_VERSION</div><div class="ttdoc">0 if no C++; 1, 11, 14, ... </div><div class="ttdef"><b>Definition:</b> <a href="platform_8h_source.html#l00464">platform.h:464</a></div></div> <div class="ttc" id="umachine_8h_html_af0ffb820f5dac7f2fee1a716424ef6bb"><div class="ttname"><a href="umachine_8h.html#af0ffb820f5dac7f2fee1a716424ef6bb">U_FORCE_INLINE</a></div><div class="ttdeci">#define U_FORCE_INLINE</div><div class="ttdoc">Forces function inlining on compilers that are known to support it. </div><div class="ttdef"><b>Definition:</b> <a href="umachine_8h_source.html#l00135">umachine.h:135</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints</a></div><div class="ttdoc">A C++ "range" for non-validating iteration over all of the code points of a code unit range...</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02526">utfiterator.h:2526</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues_html_adfbed7e57bd31f2fe76b21100fbf1a9c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1AllScalarValues.html#adfbed7e57bd31f2fe76b21100fbf1a9c">U_HEADER_ONLY_NAMESPACE::AllScalarValues::AllScalarValues</a></div><div class="ttdeci">AllScalarValues()</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00337">utfiterator.h:337</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_aa699c916010a5f04af4e14600cdcdbde"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#aa699c916010a5f04af4e14600cdcdbde">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::codePoint</a></div><div class="ttdeci">CP32 codePoint() const</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l00387">utfiterator.h:387</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a2a9698ef338650ae5f8484de44b566f0"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a2a9698ef338650ae5f8484de44b566f0">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator*</a></div><div class="ttdeci">U_FORCE_INLINE UnsafeCodeUnits< CP32, UnitIter > operator*() const</div><div class="ttdoc">Decodes the code unit sequence at the current position. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02090">utfiterator.h:2090</a></div></div> <div class="ttc" id="utf8_8h_html_a32281421a1d07ef0de83e7f44c5d7ba2"><div class="ttname"><a href="utf8_8h.html#a32281421a1d07ef0de83e7f44c5d7ba2">U8_COUNT_TRAIL_BYTES_UNSAFE</a></div><div class="ttdeci">#define U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte)</div><div class="ttdoc">Counts the trail bytes for a UTF-8 lead byte of a valid UTF-8 sequence. </div><div class="ttdef"><b>Definition:</b> <a href="utf8_8h_source.html#l00071">utf8.h:71</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_a12e65a84f22d47812f6aeeb53c09db2c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#a12e65a84f22d47812f6aeeb53c09db2c">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator--</a></div><div class="ttdeci">U_FORCE_INLINE std::enable_if_t< prv::bidirectional_iterator< Iter >, UTFIterator > operator--(int)</div><div class="ttdoc">Post-decrement operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01374">utfiterator.h:1374</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_ac91fe59003345bfc4b746b8d601da80d"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#ac91fe59003345bfc4b746b8d601da80d">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator!=</a></div><div class="ttdeci">U_FORCE_INLINE friend std::enable_if_t< !std::is_same_v< Sentinel, UnsafeUTFIterator > &&!std::is_same_v< Sentinel, UnitIter >, bool > operator!=(const Sentinel &s, const UnsafeUTFIterator &iter)</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02081">utfiterator.h:2081</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a01201f10dbec79504ab159c87ec92096"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a01201f10dbec79504ab159c87ec92096">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::operator--</a></div><div class="ttdeci">U_FORCE_INLINE std::enable_if_t< prv::bidirectional_iterator< Iter >, UnsafeUTFIterator & > operator--()</div><div class="ttdoc">Pre-decrement operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02176">utfiterator.h:2176</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints_html_ab8ea3c3a1f73a499fea4f6bbf871026c"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFStringCodePoints.html#ab8ea3c3a1f73a499fea4f6bbf871026c">U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints::begin</a></div><div class="ttdeci">auto begin()</div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l02563">utfiterator.h:2563</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator_html_ad8d25b256f2e2cc6c87f035baeeb80e9"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UTFIterator.html#ad8d25b256f2e2cc6c87f035baeeb80e9">U_HEADER_ONLY_NAMESPACE::UTFIterator::operator++</a></div><div class="ttdeci">U_FORCE_INLINE UTFIterator & operator++()</div><div class="ttdoc">Pre-increment operator. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01300">utfiterator.h:1300</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator_html_a5cab858a81dcba23db907c98bdbb5797"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeUTFIterator.html#a5cab858a81dcba23db907c98bdbb5797">U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator::pointer</a></div><div class="ttdeci">Proxy pointer</div><div class="ttdoc">C++ iterator boilerplate. </div><div class="ttdef"><b>Definition:</b> <a href="utfiterator_8h_source.html#l01981">utfiterator.h:1981</a></div></div> <div class="ttc" id="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits_html_ab2614effbec8d1c1ec64ae4ee40fa056"><div class="ttname"><a href="classU__HEADER__ONLY__NAMESPACE_1_1UnsafeCodeUnits.html#ab2614effbec8d1c1ec64ae4ee40fa056">U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits::operator=</a></div><div class="ttdeci">UnsafeCodeUnits & operator=(const UnsafeCodeUnits &other)=default</div><div class="ttdoc">Copy assignment operator. </div></div> </div><!-- fragment --></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> Generated by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/> </a> 1.8.14 </small></address> </body> </html>
| ver. 1.6 |
Github
|
.
| PHP 8.3.30 | Генерация страницы: 0.01 |
proxy
|
phpinfo
|
Настройка