doc: 2020-04-01 11:32:45 +0200: 478563f - Adding documentation
This commit is contained in:
29
src/unicode_normalization/__test_api.rs.html
Normal file
29
src/unicode_normalization/__test_api.rs.html
Normal file
@@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/__test_api.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>__test_api.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10">10</span>
|
||||
<span id="11">11</span>
|
||||
<span id="12">12</span>
|
||||
<span id="13">13</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// This crate comprises hacks and glue required to test private functions from tests/</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Keep this as slim as possible.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// If you're caught using this outside this crates tests/, you get to clean up the mess.</span>
|
||||
|
||||
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">stream_safe</span>::<span class="ident">StreamSafe</span>;
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">stream_safe</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">String</span> {
|
||||
<span class="ident">StreamSafe</span>::<span class="ident">new</span>(<span class="ident">s</span>.<span class="ident">chars</span>()).<span class="ident">collect</span>()
|
||||
}
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">quick_check</span> {
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">quick_check</span>::<span class="kw-2">*</span>;
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
321
src/unicode_normalization/decompose.rs.html
Normal file
321
src/unicode_normalization/decompose.rs.html
Normal file
@@ -0,0 +1,321 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/decompose.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>decompose.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
<span id="154">154</span>
|
||||
<span id="155">155</span>
|
||||
<span id="156">156</span>
|
||||
<span id="157">157</span>
|
||||
<span id="158">158</span>
|
||||
<span id="159">159</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
<span class="kw">use</span> <span class="ident">smallvec</span>::<span class="ident">SmallVec</span>;
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>::{<span class="self">self</span>, <span class="ident">Write</span>};
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">iter</span>::<span class="ident">Fuse</span>;
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">ops</span>::<span class="ident">Range</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||
<span class="kw">enum</span> <span class="ident">DecompositionType</span> {
|
||||
<span class="ident">Canonical</span>,
|
||||
<span class="ident">Compatible</span>,
|
||||
}
|
||||
|
||||
<span class="doccomment">/// External iterator for a string decomposition's characters.</span>
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">kind</span>: <span class="ident">DecompositionType</span>,
|
||||
<span class="ident">iter</span>: <span class="ident">Fuse</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>,
|
||||
|
||||
<span class="comment">// This buffer stores pairs of (canonical combining class, character),</span>
|
||||
<span class="comment">// pushed onto the end in text order.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// It's divided into up to three sections:</span>
|
||||
<span class="comment">// 1) A prefix that is free space;</span>
|
||||
<span class="comment">// 2) "Ready" characters which are sorted and ready to emit on demand;</span>
|
||||
<span class="comment">// 3) A "pending" block which stills needs more characters for us to be able</span>
|
||||
<span class="comment">// to sort in canonical order and is not safe to emit.</span>
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span><span class="op"><</span>[(<span class="ident">u8</span>, <span class="ident">char</span>); <span class="number">4</span>]<span class="op">></span>,
|
||||
<span class="ident">ready</span>: <span class="ident">Range</span><span class="op"><</span><span class="ident">usize</span><span class="op">></span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new_canonical</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">iter</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">Decompositions</span> {
|
||||
<span class="ident">kind</span>: <span class="self">self</span>::<span class="ident">DecompositionType</span>::<span class="ident">Canonical</span>,
|
||||
<span class="ident">iter</span>: <span class="ident">iter</span>.<span class="ident">fuse</span>(),
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
|
||||
<span class="ident">ready</span>: <span class="number">0</span>..<span class="number">0</span>,
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new_compatible</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">iter</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">Decompositions</span> {
|
||||
<span class="ident">kind</span>: <span class="self">self</span>::<span class="ident">DecompositionType</span>::<span class="ident">Compatible</span>,
|
||||
<span class="ident">iter</span>: <span class="ident">iter</span>.<span class="ident">fuse</span>(),
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
|
||||
<span class="ident">ready</span>: <span class="number">0</span>..<span class="number">0</span>,
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">push_back</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">ch</span>: <span class="ident">char</span>) {
|
||||
<span class="kw">let</span> <span class="ident">class</span> <span class="op">=</span> <span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">canonical_combining_class</span>(<span class="ident">ch</span>);
|
||||
|
||||
<span class="kw">if</span> <span class="ident">class</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="self">self</span>.<span class="ident">sort_pending</span>();
|
||||
}
|
||||
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">push</span>((<span class="ident">class</span>, <span class="ident">ch</span>));
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">sort_pending</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) {
|
||||
<span class="comment">// NB: `sort_by_key` is stable, so it will preserve the original text's</span>
|
||||
<span class="comment">// order within a combining class.</span>
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>[<span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span>..].<span class="ident">sort_by_key</span>(<span class="op">|</span><span class="ident">k</span><span class="op">|</span> <span class="ident">k</span>.<span class="number">0</span>);
|
||||
<span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">len</span>();
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">reset_buffer</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) {
|
||||
<span class="comment">// Equivalent to `self.buffer.drain(0..self.ready.end)` (if SmallVec</span>
|
||||
<span class="comment">// supported this API)</span>
|
||||
<span class="kw">let</span> <span class="ident">pending</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">len</span>() <span class="op">-</span> <span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span>;
|
||||
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="number">0</span>..<span class="ident">pending</span> {
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>[<span class="ident">i</span>] <span class="op">=</span> <span class="self">self</span>.<span class="ident">buffer</span>[<span class="ident">i</span> <span class="op">+</span> <span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span>];
|
||||
}
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">truncate</span>(<span class="ident">pending</span>);
|
||||
<span class="self">self</span>.<span class="ident">ready</span> <span class="op">=</span> <span class="number">0</span>..<span class="number">0</span>;
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">increment_next_ready</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) {
|
||||
<span class="kw">let</span> <span class="ident">next</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">start</span> <span class="op">+</span> <span class="number">1</span>;
|
||||
<span class="kw">if</span> <span class="ident">next</span> <span class="op">=</span><span class="op">=</span> <span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span> {
|
||||
<span class="self">self</span>.<span class="ident">reset_buffer</span>();
|
||||
} <span class="kw">else</span> {
|
||||
<span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">start</span> <span class="op">=</span> <span class="ident">next</span>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span> <span class="ident">Iterator</span> <span class="kw">for</span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">type</span> <span class="ident">Item</span> <span class="op">=</span> <span class="ident">char</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">next</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="kw">while</span> <span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">end</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="kw">match</span> (<span class="self">self</span>.<span class="ident">iter</span>.<span class="ident">next</span>(), <span class="kw-2">&</span><span class="self">self</span>.<span class="ident">kind</span>) {
|
||||
(<span class="prelude-val">Some</span>(<span class="ident">ch</span>), <span class="kw-2">&</span><span class="ident">DecompositionType</span>::<span class="ident">Canonical</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">decompose_canonical</span>(<span class="ident">ch</span>, <span class="op">|</span><span class="ident">d</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">push_back</span>(<span class="ident">d</span>));
|
||||
}
|
||||
(<span class="prelude-val">Some</span>(<span class="ident">ch</span>), <span class="kw-2">&</span><span class="ident">DecompositionType</span>::<span class="ident">Compatible</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">decompose_compatible</span>(<span class="ident">ch</span>, <span class="op">|</span><span class="ident">d</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">push_back</span>(<span class="ident">d</span>));
|
||||
}
|
||||
(<span class="prelude-val">None</span>, <span class="kw">_</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">is_empty</span>() {
|
||||
<span class="kw">return</span> <span class="prelude-val">None</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="self">self</span>.<span class="ident">sort_pending</span>();
|
||||
|
||||
<span class="comment">// This implementation means that we can call `next`</span>
|
||||
<span class="comment">// on an exhausted iterator; the last outer `next` call</span>
|
||||
<span class="comment">// will result in an inner `next` call. To make this</span>
|
||||
<span class="comment">// safe, we use `fuse`.</span>
|
||||
<span class="kw">break</span>;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="comment">// We can assume here that, if `self.ready.end` is greater than zero,</span>
|
||||
<span class="comment">// it's also greater than `self.ready.start`. That's because we only</span>
|
||||
<span class="comment">// increment `self.ready.start` inside `increment_next_ready`, and</span>
|
||||
<span class="comment">// whenever it reaches equality with `self.ready.end`, we reset both</span>
|
||||
<span class="comment">// to zero, maintaining the invariant that:</span>
|
||||
<span class="comment">// self.ready.start < self.ready.end || self.ready.end == self.ready.start == 0</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// This less-than-obviously-safe implementation is chosen for performance,</span>
|
||||
<span class="comment">// minimizing the number & complexity of branches in `next` in the common</span>
|
||||
<span class="comment">// case of buffering then unbuffering a single character with each call.</span>
|
||||
<span class="kw">let</span> (<span class="kw">_</span>, <span class="ident">ch</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">buffer</span>[<span class="self">self</span>.<span class="ident">ready</span>.<span class="ident">start</span>];
|
||||
<span class="self">self</span>.<span class="ident">increment_next_ready</span>();
|
||||
<span class="prelude-val">Some</span>(<span class="ident">ch</span>)
|
||||
}
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">size_hint</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-</span><span class="op">></span> (<span class="ident">usize</span>, <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">usize</span><span class="op">></span>) {
|
||||
<span class="kw">let</span> (<span class="ident">lower</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">iter</span>.<span class="ident">size_hint</span>();
|
||||
(<span class="ident">lower</span>, <span class="prelude-val">None</span>)
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span> <span class="op">+</span> <span class="ident">Clone</span><span class="op">></span> <span class="ident">fmt</span>::<span class="ident">Display</span> <span class="kw">for</span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||
<span class="kw">for</span> <span class="ident">c</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">clone</span>() {
|
||||
<span class="ident">f</span>.<span class="ident">write_char</span>(<span class="ident">c</span>)<span class="question-mark">?</span>;
|
||||
}
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
345
src/unicode_normalization/lib.rs.html
Normal file
345
src/unicode_normalization/lib.rs.html
Normal file
@@ -0,0 +1,345 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
<span id="154">154</span>
|
||||
<span id="155">155</span>
|
||||
<span id="156">156</span>
|
||||
<span id="157">157</span>
|
||||
<span id="158">158</span>
|
||||
<span id="159">159</span>
|
||||
<span id="160">160</span>
|
||||
<span id="161">161</span>
|
||||
<span id="162">162</span>
|
||||
<span id="163">163</span>
|
||||
<span id="164">164</span>
|
||||
<span id="165">165</span>
|
||||
<span id="166">166</span>
|
||||
<span id="167">167</span>
|
||||
<span id="168">168</span>
|
||||
<span id="169">169</span>
|
||||
<span id="170">170</span>
|
||||
<span id="171">171</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
|
||||
<span class="doccomment">//! Unicode character composition and decomposition utilities</span>
|
||||
<span class="doccomment">//! as described in</span>
|
||||
<span class="doccomment">//! [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/).</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! ```rust</span>
|
||||
<span class="doccomment">//! extern crate unicode_normalization;</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! use unicode_normalization::char::compose;</span>
|
||||
<span class="doccomment">//! use unicode_normalization::UnicodeNormalization;</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! fn main() {</span>
|
||||
<span class="doccomment">//! assert_eq!(compose('A','\u{30a}'), Some('Å'));</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! let s = "ÅΩ";</span>
|
||||
<span class="doccomment">//! let c = s.nfc().collect::<String>();</span>
|
||||
<span class="doccomment">//! assert_eq!(c, "ÅΩ");</span>
|
||||
<span class="doccomment">//! }</span>
|
||||
<span class="doccomment">//! ```</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! # crates.io</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! You can use this package in your project by adding the following</span>
|
||||
<span class="doccomment">//! to your `Cargo.toml`:</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! ```toml</span>
|
||||
<span class="doccomment">//! [dependencies]</span>
|
||||
<span class="doccomment">//! unicode-normalization = "0.1.8"</span>
|
||||
<span class="doccomment">//! ```</span>
|
||||
|
||||
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">missing_docs</span>, <span class="ident">unsafe_code</span>)]</span>
|
||||
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_logo_url</span> <span class="op">=</span> <span class="string">"https://unicode-rs.github.io/unicode-rs_sm.png"</span>,
|
||||
<span class="ident">html_favicon_url</span> <span class="op">=</span> <span class="string">"https://unicode-rs.github.io/unicode-rs_sm.png"</span>)]</span>
|
||||
|
||||
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">smallvec</span>;
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">tables</span>::<span class="ident">UNICODE_VERSION</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">decompose</span>::<span class="ident">Decompositions</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">quick_check</span>::{
|
||||
<span class="ident">IsNormalized</span>,
|
||||
<span class="ident">is_nfc</span>,
|
||||
<span class="ident">is_nfc_quick</span>,
|
||||
<span class="ident">is_nfkc</span>,
|
||||
<span class="ident">is_nfkc_quick</span>,
|
||||
<span class="ident">is_nfc_stream_safe</span>,
|
||||
<span class="ident">is_nfc_stream_safe_quick</span>,
|
||||
<span class="ident">is_nfd</span>,
|
||||
<span class="ident">is_nfd_quick</span>,
|
||||
<span class="ident">is_nfkd</span>,
|
||||
<span class="ident">is_nfkd_quick</span>,
|
||||
<span class="ident">is_nfd_stream_safe</span>,
|
||||
<span class="ident">is_nfd_stream_safe_quick</span>,
|
||||
};
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">recompose</span>::<span class="ident">Recompositions</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">stream_safe</span>::<span class="ident">StreamSafe</span>;
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">str</span>::<span class="ident">Chars</span>;
|
||||
|
||||
<span class="kw">mod</span> <span class="ident">decompose</span>;
|
||||
<span class="kw">mod</span> <span class="ident">lookups</span>;
|
||||
<span class="kw">mod</span> <span class="ident">normalize</span>;
|
||||
<span class="kw">mod</span> <span class="ident">perfect_hash</span>;
|
||||
<span class="kw">mod</span> <span class="ident">recompose</span>;
|
||||
<span class="kw">mod</span> <span class="ident">quick_check</span>;
|
||||
<span class="kw">mod</span> <span class="ident">stream_safe</span>;
|
||||
<span class="kw">mod</span> <span class="ident">tables</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
|
||||
<span class="kw">mod</span> <span class="ident">test</span>;
|
||||
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">__test_api</span>;
|
||||
|
||||
<span class="doccomment">/// Methods for composing and decomposing characters.</span>
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">char</span> {
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">normalize</span>::{<span class="ident">decompose_canonical</span>, <span class="ident">decompose_compatible</span>, <span class="ident">compose</span>};
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">lookups</span>::{<span class="ident">canonical_combining_class</span>, <span class="ident">is_combining_mark</span>};
|
||||
}
|
||||
|
||||
|
||||
<span class="doccomment">/// Methods for iterating over strings while applying Unicode normalizations</span>
|
||||
<span class="doccomment">/// as described in</span>
|
||||
<span class="doccomment">/// [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/).</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">UnicodeNormalization</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="doccomment">/// Returns an iterator over the string in Unicode Normalization Form D</span>
|
||||
<span class="doccomment">/// (canonical decomposition).</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>;
|
||||
|
||||
<span class="doccomment">/// Returns an iterator over the string in Unicode Normalization Form KD</span>
|
||||
<span class="doccomment">/// (compatibility decomposition).</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>;
|
||||
|
||||
<span class="doccomment">/// An Iterator over the string in Unicode Normalization Form C</span>
|
||||
<span class="doccomment">/// (canonical decomposition followed by canonical composition).</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>;
|
||||
|
||||
<span class="doccomment">/// An Iterator over the string in Unicode Normalization Form KC</span>
|
||||
<span class="doccomment">/// (compatibility decomposition followed by canonical composition).</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>;
|
||||
|
||||
<span class="doccomment">/// An Iterator over the string with Conjoining Grapheme Joiner characters</span>
|
||||
<span class="doccomment">/// inserted according to the Stream-Safe Text Process (UAX15-D4)</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">stream_safe</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>;
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> <span class="ident">UnicodeNormalization</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> <span class="kw">for</span> <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span> {
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="ident">decompose</span>::<span class="ident">new_canonical</span>(<span class="self">self</span>.<span class="ident">chars</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="ident">decompose</span>::<span class="ident">new_compatible</span>(<span class="self">self</span>.<span class="ident">chars</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="ident">recompose</span>::<span class="ident">new_canonical</span>(<span class="self">self</span>.<span class="ident">chars</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="ident">recompose</span>::<span class="ident">new_compatible</span>(<span class="self">self</span>.<span class="ident">chars</span>())
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">stream_safe</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">Chars</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span><span class="op">></span> {
|
||||
<span class="ident">StreamSafe</span>::<span class="ident">new</span>(<span class="self">self</span>.<span class="ident">chars</span>())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span> <span class="ident">UnicodeNormalization</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> <span class="kw">for</span> <span class="ident">I</span> {
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">decompose</span>::<span class="ident">new_canonical</span>(<span class="self">self</span>)
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkd</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">decompose</span>::<span class="ident">new_compatible</span>(<span class="self">self</span>)
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">recompose</span>::<span class="ident">new_canonical</span>(<span class="self">self</span>)
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">nfkc</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">recompose</span>::<span class="ident">new_compatible</span>(<span class="self">self</span>)
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">stream_safe</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">StreamSafe</span>::<span class="ident">new</span>(<span class="self">self</span>)
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
181
src/unicode_normalization/lookups.rs.html
Normal file
181
src/unicode_normalization/lookups.rs.html
Normal file
@@ -0,0 +1,181 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/lookups.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lookups.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10">10</span>
|
||||
<span id="11">11</span>
|
||||
<span id="12">12</span>
|
||||
<span id="13">13</span>
|
||||
<span id="14">14</span>
|
||||
<span id="15">15</span>
|
||||
<span id="16">16</span>
|
||||
<span id="17">17</span>
|
||||
<span id="18">18</span>
|
||||
<span id="19">19</span>
|
||||
<span id="20">20</span>
|
||||
<span id="21">21</span>
|
||||
<span id="22">22</span>
|
||||
<span id="23">23</span>
|
||||
<span id="24">24</span>
|
||||
<span id="25">25</span>
|
||||
<span id="26">26</span>
|
||||
<span id="27">27</span>
|
||||
<span id="28">28</span>
|
||||
<span id="29">29</span>
|
||||
<span id="30">30</span>
|
||||
<span id="31">31</span>
|
||||
<span id="32">32</span>
|
||||
<span id="33">33</span>
|
||||
<span id="34">34</span>
|
||||
<span id="35">35</span>
|
||||
<span id="36">36</span>
|
||||
<span id="37">37</span>
|
||||
<span id="38">38</span>
|
||||
<span id="39">39</span>
|
||||
<span id="40">40</span>
|
||||
<span id="41">41</span>
|
||||
<span id="42">42</span>
|
||||
<span id="43">43</span>
|
||||
<span id="44">44</span>
|
||||
<span id="45">45</span>
|
||||
<span id="46">46</span>
|
||||
<span id="47">47</span>
|
||||
<span id="48">48</span>
|
||||
<span id="49">49</span>
|
||||
<span id="50">50</span>
|
||||
<span id="51">51</span>
|
||||
<span id="52">52</span>
|
||||
<span id="53">53</span>
|
||||
<span id="54">54</span>
|
||||
<span id="55">55</span>
|
||||
<span id="56">56</span>
|
||||
<span id="57">57</span>
|
||||
<span id="58">58</span>
|
||||
<span id="59">59</span>
|
||||
<span id="60">60</span>
|
||||
<span id="61">61</span>
|
||||
<span id="62">62</span>
|
||||
<span id="63">63</span>
|
||||
<span id="64">64</span>
|
||||
<span id="65">65</span>
|
||||
<span id="66">66</span>
|
||||
<span id="67">67</span>
|
||||
<span id="68">68</span>
|
||||
<span id="69">69</span>
|
||||
<span id="70">70</span>
|
||||
<span id="71">71</span>
|
||||
<span id="72">72</span>
|
||||
<span id="73">73</span>
|
||||
<span id="74">74</span>
|
||||
<span id="75">75</span>
|
||||
<span id="76">76</span>
|
||||
<span id="77">77</span>
|
||||
<span id="78">78</span>
|
||||
<span id="79">79</span>
|
||||
<span id="80">80</span>
|
||||
<span id="81">81</span>
|
||||
<span id="82">82</span>
|
||||
<span id="83">83</span>
|
||||
<span id="84">84</span>
|
||||
<span id="85">85</span>
|
||||
<span id="86">86</span>
|
||||
<span id="87">87</span>
|
||||
<span id="88">88</span>
|
||||
<span id="89">89</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2019 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
|
||||
<span class="doccomment">//! Lookups of unicode properties using minimal perfect hashing.</span>
|
||||
|
||||
<span class="kw">use</span> <span class="ident">perfect_hash</span>::<span class="ident">mph_lookup</span>;
|
||||
<span class="kw">use</span> <span class="ident">tables</span>::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="doccomment">/// Look up the canonical combining class for a codepoint.</span>
|
||||
<span class="doccomment">/// </span>
|
||||
<span class="doccomment">/// The value returned is as defined in the Unicode Character Database.</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">canonical_combining_class</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">u8</span> {
|
||||
<span class="ident">mph_lookup</span>(<span class="ident">c</span>.<span class="ident">into</span>(), <span class="ident">CANONICAL_COMBINING_CLASS_SALT</span>, <span class="ident">CANONICAL_COMBINING_CLASS_KV</span>,
|
||||
<span class="ident">u8_lookup_fk</span>, <span class="ident">u8_lookup_fv</span>, <span class="number">0</span>)
|
||||
}
|
||||
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">composition_table</span>(<span class="ident">c1</span>: <span class="ident">char</span>, <span class="ident">c2</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">c1</span> <span class="op"><</span> <span class="string">'\u{10000}'</span> <span class="kw-2">&</span><span class="op">&</span> <span class="ident">c2</span> <span class="op"><</span> <span class="string">'\u{10000}'</span> {
|
||||
<span class="ident">mph_lookup</span>((<span class="ident">c1</span> <span class="kw">as</span> <span class="ident">u32</span>) <span class="op"><</span><span class="op"><</span> <span class="number">16</span> <span class="op">|</span> (<span class="ident">c2</span> <span class="kw">as</span> <span class="ident">u32</span>),
|
||||
<span class="ident">COMPOSITION_TABLE_SALT</span>, <span class="ident">COMPOSITION_TABLE_KV</span>,
|
||||
<span class="ident">pair_lookup_fk</span>, <span class="ident">pair_lookup_fv_opt</span>, <span class="prelude-val">None</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">composition_table_astral</span>(<span class="ident">c1</span>, <span class="ident">c2</span>)
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">canonical_fully_decomposed</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="lifetime">'static</span> [<span class="ident">char</span>]<span class="op">></span> {
|
||||
<span class="ident">mph_lookup</span>(<span class="ident">c</span>.<span class="ident">into</span>(), <span class="ident">CANONICAL_DECOMPOSED_SALT</span>, <span class="ident">CANONICAL_DECOMPOSED_KV</span>,
|
||||
<span class="ident">pair_lookup_fk</span>, <span class="ident">pair_lookup_fv_opt</span>, <span class="prelude-val">None</span>)
|
||||
}
|
||||
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">compatibility_fully_decomposed</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="lifetime">'static</span> [<span class="ident">char</span>]<span class="op">></span> {
|
||||
<span class="ident">mph_lookup</span>(<span class="ident">c</span>.<span class="ident">into</span>(), <span class="ident">COMPATIBILITY_DECOMPOSED_SALT</span>, <span class="ident">COMPATIBILITY_DECOMPOSED_KV</span>,
|
||||
<span class="ident">pair_lookup_fk</span>, <span class="ident">pair_lookup_fv_opt</span>, <span class="prelude-val">None</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Return whether the given character is a combining mark (`General_Category=Mark`)</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_combining_mark</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="ident">mph_lookup</span>(<span class="ident">c</span>.<span class="ident">into</span>(), <span class="ident">COMBINING_MARK_SALT</span>, <span class="ident">COMBINING_MARK_KV</span>,
|
||||
<span class="ident">bool_lookup_fk</span>, <span class="ident">bool_lookup_fv</span>, <span class="bool-val">false</span>)
|
||||
}
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">stream_safe_trailing_nonstarters</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">usize</span> {
|
||||
<span class="ident">mph_lookup</span>(<span class="ident">c</span>.<span class="ident">into</span>(), <span class="ident">TRAILING_NONSTARTERS_SALT</span>, <span class="ident">TRAILING_NONSTARTERS_KV</span>,
|
||||
<span class="ident">u8_lookup_fk</span>, <span class="ident">u8_lookup_fv</span>, <span class="number">0</span>) <span class="kw">as</span> <span class="ident">usize</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the key in a 24 bit key and 8 bit value packed in a u32.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">u8_lookup_fk</span>(<span class="ident">kv</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">></span> <span class="ident">u32</span> {
|
||||
<span class="ident">kv</span> <span class="op">></span><span class="op">></span> <span class="number">8</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the value in a 24 bit key and 8 bit value packed in a u32.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">u8_lookup_fv</span>(<span class="ident">kv</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">></span> <span class="ident">u8</span> {
|
||||
(<span class="ident">kv</span> <span class="op">&</span> <span class="number">0xff</span>) <span class="kw">as</span> <span class="ident">u8</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the key for a boolean lookup.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">bool_lookup_fk</span>(<span class="ident">kv</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">></span> <span class="ident">u32</span> {
|
||||
<span class="ident">kv</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the value for a boolean lookup.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">bool_lookup_fv</span>(<span class="ident">_kv</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="bool-val">true</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the key in a pair.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">pair_lookup_fk</span><span class="op"><</span><span class="ident">T</span><span class="op">></span>(<span class="ident">kv</span>: (<span class="ident">u32</span>, <span class="ident">T</span>)) <span class="op">-</span><span class="op">></span> <span class="ident">u32</span> {
|
||||
<span class="ident">kv</span>.<span class="number">0</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Extract the value in a pair, returning an option.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">pair_lookup_fv_opt</span><span class="op"><</span><span class="ident">T</span><span class="op">></span>(<span class="ident">kv</span>: (<span class="ident">u32</span>, <span class="ident">T</span>)) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">kv</span>.<span class="number">1</span>)
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
309
src/unicode_normalization/normalize.rs.html
Normal file
309
src/unicode_normalization/normalize.rs.html
Normal file
@@ -0,0 +1,309 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/normalize.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>normalize.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
|
||||
<span class="doccomment">//! Functions for computing canonical and compatible decompositions for Unicode characters.</span>
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">char</span>;
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">ops</span>::<span class="ident">FnMut</span>;
|
||||
<span class="kw">use</span> <span class="ident">lookups</span>::{<span class="ident">canonical_fully_decomposed</span>, <span class="ident">composition_table</span>, <span class="ident">compatibility_fully_decomposed</span>};
|
||||
|
||||
<span class="doccomment">/// Compute canonical Unicode decomposition for character.</span>
|
||||
<span class="doccomment">/// See [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/)</span>
|
||||
<span class="doccomment">/// for more information.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">decompose_canonical</span><span class="op"><</span><span class="ident">F</span><span class="op">></span>(<span class="ident">c</span>: <span class="ident">char</span>, <span class="ident">emit_char</span>: <span class="ident">F</span>) <span class="kw">where</span> <span class="ident">F</span>: <span class="ident">FnMut</span>(<span class="ident">char</span>) {
|
||||
<span class="ident">decompose</span>(<span class="ident">c</span>, <span class="ident">canonical_fully_decomposed</span>, <span class="ident">emit_char</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Compute canonical or compatible Unicode decomposition for character.</span>
|
||||
<span class="doccomment">/// See [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/)</span>
|
||||
<span class="doccomment">/// for more information.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">decompose_compatible</span><span class="op"><</span><span class="ident">F</span>: <span class="ident">FnMut</span>(<span class="ident">char</span>)<span class="op">></span>(<span class="ident">c</span>: <span class="ident">char</span>, <span class="ident">emit_char</span>: <span class="ident">F</span>) {
|
||||
<span class="kw">let</span> <span class="ident">decompose_char</span> <span class="op">=</span> <span class="op">|</span><span class="ident">c</span><span class="op">|</span> <span class="ident">compatibility_fully_decomposed</span>(<span class="ident">c</span>)
|
||||
.<span class="ident">or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">canonical_fully_decomposed</span>(<span class="ident">c</span>));
|
||||
<span class="ident">decompose</span>(<span class="ident">c</span>, <span class="ident">decompose_char</span>, <span class="ident">emit_char</span>)
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">decompose</span><span class="op"><</span><span class="ident">D</span>, <span class="ident">F</span><span class="op">></span>(<span class="ident">c</span>: <span class="ident">char</span>, <span class="ident">decompose_char</span>: <span class="ident">D</span>, <span class="kw-2">mut</span> <span class="ident">emit_char</span>: <span class="ident">F</span>)
|
||||
<span class="kw">where</span> <span class="ident">D</span>: <span class="ident">Fn</span>(<span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="lifetime">'static</span> [<span class="ident">char</span>]<span class="op">></span>, <span class="ident">F</span>: <span class="ident">FnMut</span>(<span class="ident">char</span>)
|
||||
{
|
||||
<span class="comment">// 7-bit ASCII never decomposes</span>
|
||||
<span class="kw">if</span> <span class="ident">c</span> <span class="op"><</span><span class="op">=</span> <span class="string">'\x7f'</span> {
|
||||
<span class="ident">emit_char</span>(<span class="ident">c</span>);
|
||||
<span class="kw">return</span>;
|
||||
}
|
||||
|
||||
<span class="comment">// Perform decomposition for Hangul</span>
|
||||
<span class="kw">if</span> <span class="ident">is_hangul_syllable</span>(<span class="ident">c</span>) {
|
||||
<span class="ident">decompose_hangul</span>(<span class="ident">c</span>, <span class="ident">emit_char</span>);
|
||||
<span class="kw">return</span>;
|
||||
}
|
||||
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">decomposed</span>) <span class="op">=</span> <span class="ident">decompose_char</span>(<span class="ident">c</span>) {
|
||||
<span class="kw">for</span> <span class="kw-2">&</span><span class="ident">d</span> <span class="kw">in</span> <span class="ident">decomposed</span> {
|
||||
<span class="ident">emit_char</span>(<span class="ident">d</span>);
|
||||
}
|
||||
<span class="kw">return</span>;
|
||||
}
|
||||
|
||||
<span class="comment">// Finally bottom out.</span>
|
||||
<span class="ident">emit_char</span>(<span class="ident">c</span>);
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Compose two characters into a single character, if possible.</span>
|
||||
<span class="doccomment">/// See [Unicode Standard Annex #15](http://www.unicode.org/reports/tr15/)</span>
|
||||
<span class="doccomment">/// for more information.</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">compose</span>(<span class="ident">a</span>: <span class="ident">char</span>, <span class="ident">b</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="ident">compose_hangul</span>(<span class="ident">a</span>, <span class="ident">b</span>).<span class="ident">or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">composition_table</span>(<span class="ident">a</span>, <span class="ident">b</span>))
|
||||
}
|
||||
|
||||
<span class="comment">// Constants from Unicode 9.0.0 Section 3.12 Conjoining Jamo Behavior</span>
|
||||
<span class="comment">// http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf#M9.32468.Heading.310.Combining.Jamo.Behavior</span>
|
||||
<span class="kw">const</span> <span class="ident">S_BASE</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0xAC00</span>;
|
||||
<span class="kw">const</span> <span class="ident">L_BASE</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0x1100</span>;
|
||||
<span class="kw">const</span> <span class="ident">V_BASE</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0x1161</span>;
|
||||
<span class="kw">const</span> <span class="ident">T_BASE</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">0x11A7</span>;
|
||||
<span class="kw">const</span> <span class="ident">L_COUNT</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">19</span>;
|
||||
<span class="kw">const</span> <span class="ident">V_COUNT</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">21</span>;
|
||||
<span class="kw">const</span> <span class="ident">T_COUNT</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="number">28</span>;
|
||||
<span class="kw">const</span> <span class="ident">N_COUNT</span>: <span class="ident">u32</span> <span class="op">=</span> (<span class="ident">V_COUNT</span> <span class="op">*</span> <span class="ident">T_COUNT</span>);
|
||||
<span class="kw">const</span> <span class="ident">S_COUNT</span>: <span class="ident">u32</span> <span class="op">=</span> (<span class="ident">L_COUNT</span> <span class="op">*</span> <span class="ident">N_COUNT</span>);
|
||||
|
||||
<span class="kw">const</span> <span class="ident">S_LAST</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">S_BASE</span> <span class="op">+</span> <span class="ident">S_COUNT</span> <span class="op">-</span> <span class="number">1</span>;
|
||||
<span class="kw">const</span> <span class="ident">L_LAST</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">L_BASE</span> <span class="op">+</span> <span class="ident">L_COUNT</span> <span class="op">-</span> <span class="number">1</span>;
|
||||
<span class="kw">const</span> <span class="ident">V_LAST</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">V_BASE</span> <span class="op">+</span> <span class="ident">V_COUNT</span> <span class="op">-</span> <span class="number">1</span>;
|
||||
<span class="kw">const</span> <span class="ident">T_LAST</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">T_BASE</span> <span class="op">+</span> <span class="ident">T_COUNT</span> <span class="op">-</span> <span class="number">1</span>;
|
||||
|
||||
<span class="comment">// Composition only occurs for `TPart`s in `U+11A8 ... U+11C2`,</span>
|
||||
<span class="comment">// i.e. `T_BASE + 1 ... T_LAST`.</span>
|
||||
<span class="kw">const</span> <span class="ident">T_FIRST</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">T_BASE</span> <span class="op">+</span> <span class="number">1</span>;
|
||||
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">is_hangul_syllable</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
(<span class="ident">c</span> <span class="kw">as</span> <span class="ident">u32</span>) <span class="op">></span><span class="op">=</span> <span class="ident">S_BASE</span> <span class="kw-2">&</span><span class="op">&</span> (<span class="ident">c</span> <span class="kw">as</span> <span class="ident">u32</span>) <span class="op"><</span> (<span class="ident">S_BASE</span> <span class="op">+</span> <span class="ident">S_COUNT</span>)
|
||||
}
|
||||
|
||||
<span class="comment">// Decompose a precomposed Hangul syllable</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">unsafe_code</span>)]</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
||||
<span class="kw">fn</span> <span class="ident">decompose_hangul</span><span class="op"><</span><span class="ident">F</span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">char</span>, <span class="kw-2">mut</span> <span class="ident">emit_char</span>: <span class="ident">F</span>) <span class="kw">where</span> <span class="ident">F</span>: <span class="ident">FnMut</span>(<span class="ident">char</span>) {
|
||||
<span class="kw">let</span> <span class="ident">s_index</span> <span class="op">=</span> <span class="ident">s</span> <span class="kw">as</span> <span class="ident">u32</span> <span class="op">-</span> <span class="ident">S_BASE</span>;
|
||||
<span class="kw">let</span> <span class="ident">l_index</span> <span class="op">=</span> <span class="ident">s_index</span> <span class="op">/</span> <span class="ident">N_COUNT</span>;
|
||||
<span class="kw">unsafe</span> {
|
||||
<span class="ident">emit_char</span>(<span class="ident">char</span>::<span class="ident">from_u32_unchecked</span>(<span class="ident">L_BASE</span> <span class="op">+</span> <span class="ident">l_index</span>));
|
||||
|
||||
<span class="kw">let</span> <span class="ident">v_index</span> <span class="op">=</span> (<span class="ident">s_index</span> <span class="op">%</span> <span class="ident">N_COUNT</span>) <span class="op">/</span> <span class="ident">T_COUNT</span>;
|
||||
<span class="ident">emit_char</span>(<span class="ident">char</span>::<span class="ident">from_u32_unchecked</span>(<span class="ident">V_BASE</span> <span class="op">+</span> <span class="ident">v_index</span>));
|
||||
|
||||
<span class="kw">let</span> <span class="ident">t_index</span> <span class="op">=</span> <span class="ident">s_index</span> <span class="op">%</span> <span class="ident">T_COUNT</span>;
|
||||
<span class="kw">if</span> <span class="ident">t_index</span> <span class="op">></span> <span class="number">0</span> {
|
||||
<span class="ident">emit_char</span>(<span class="ident">char</span>::<span class="ident">from_u32_unchecked</span>(<span class="ident">T_BASE</span> <span class="op">+</span> <span class="ident">t_index</span>));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">hangul_decomposition_length</span>(<span class="ident">s</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">usize</span> {
|
||||
<span class="kw">let</span> <span class="ident">si</span> <span class="op">=</span> <span class="ident">s</span> <span class="kw">as</span> <span class="ident">u32</span> <span class="op">-</span> <span class="ident">S_BASE</span>;
|
||||
<span class="kw">let</span> <span class="ident">ti</span> <span class="op">=</span> <span class="ident">si</span> <span class="op">%</span> <span class="ident">T_COUNT</span>;
|
||||
<span class="kw">if</span> <span class="ident">ti</span> <span class="op">></span> <span class="number">0</span> { <span class="number">3</span> } <span class="kw">else</span> { <span class="number">2</span> }
|
||||
}
|
||||
|
||||
<span class="comment">// Compose a pair of Hangul Jamo</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">unsafe_code</span>)]</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">ellipsis_inclusive_range_patterns</span>)]</span>
|
||||
<span class="kw">fn</span> <span class="ident">compose_hangul</span>(<span class="ident">a</span>: <span class="ident">char</span>, <span class="ident">b</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="kw">let</span> (<span class="ident">a</span>, <span class="ident">b</span>) <span class="op">=</span> (<span class="ident">a</span> <span class="kw">as</span> <span class="ident">u32</span>, <span class="ident">b</span> <span class="kw">as</span> <span class="ident">u32</span>);
|
||||
<span class="kw">match</span> (<span class="ident">a</span>, <span class="ident">b</span>) {
|
||||
<span class="comment">// Compose a leading consonant and a vowel together into an LV_Syllable</span>
|
||||
(<span class="ident">L_BASE</span> ... <span class="ident">L_LAST</span>, <span class="ident">V_BASE</span> ... <span class="ident">V_LAST</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">let</span> <span class="ident">l_index</span> <span class="op">=</span> <span class="ident">a</span> <span class="op">-</span> <span class="ident">L_BASE</span>;
|
||||
<span class="kw">let</span> <span class="ident">v_index</span> <span class="op">=</span> <span class="ident">b</span> <span class="op">-</span> <span class="ident">V_BASE</span>;
|
||||
<span class="kw">let</span> <span class="ident">lv_index</span> <span class="op">=</span> <span class="ident">l_index</span> <span class="op">*</span> <span class="ident">N_COUNT</span> <span class="op">+</span> <span class="ident">v_index</span> <span class="op">*</span> <span class="ident">T_COUNT</span>;
|
||||
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">S_BASE</span> <span class="op">+</span> <span class="ident">lv_index</span>;
|
||||
<span class="prelude-val">Some</span>(<span class="kw">unsafe</span> {<span class="ident">char</span>::<span class="ident">from_u32_unchecked</span>(<span class="ident">s</span>)})
|
||||
},
|
||||
<span class="comment">// Compose an LV_Syllable and a trailing consonant into an LVT_Syllable</span>
|
||||
(<span class="ident">S_BASE</span> ... <span class="ident">S_LAST</span>, <span class="ident">T_FIRST</span> ... <span class="ident">T_LAST</span>) <span class="kw">if</span> (<span class="ident">a</span> <span class="op">-</span> <span class="ident">S_BASE</span>) <span class="op">%</span> <span class="ident">T_COUNT</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="prelude-val">Some</span>(<span class="kw">unsafe</span> {<span class="ident">char</span>::<span class="ident">from_u32_unchecked</span>(<span class="ident">a</span> <span class="op">+</span> (<span class="ident">b</span> <span class="op">-</span> <span class="ident">T_BASE</span>))})
|
||||
},
|
||||
<span class="kw">_</span> <span class="op">=</span><span class="op">></span> <span class="prelude-val">None</span>,
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
|
||||
<span class="kw">mod</span> <span class="ident">tests</span> {
|
||||
<span class="kw">use</span> <span class="kw">super</span>::<span class="ident">compose_hangul</span>;
|
||||
|
||||
<span class="comment">// Regression test from a bugfix where we were composing an LV_Syllable with</span>
|
||||
<span class="comment">// T_BASE directly. (We should only compose an LV_Syllable with a character</span>
|
||||
<span class="comment">// in the range `T_BASE + 1 ... T_LAST`.)</span>
|
||||
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">test_hangul_composition</span>() {
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compose_hangul</span>(<span class="string">'\u{c8e0}'</span>, <span class="string">'\u{11a7}'</span>), <span class="prelude-val">None</span>);
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
85
src/unicode_normalization/perfect_hash.rs.html
Normal file
85
src/unicode_normalization/perfect_hash.rs.html
Normal file
@@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/perfect_hash.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>perfect_hash.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10">10</span>
|
||||
<span id="11">11</span>
|
||||
<span id="12">12</span>
|
||||
<span id="13">13</span>
|
||||
<span id="14">14</span>
|
||||
<span id="15">15</span>
|
||||
<span id="16">16</span>
|
||||
<span id="17">17</span>
|
||||
<span id="18">18</span>
|
||||
<span id="19">19</span>
|
||||
<span id="20">20</span>
|
||||
<span id="21">21</span>
|
||||
<span id="22">22</span>
|
||||
<span id="23">23</span>
|
||||
<span id="24">24</span>
|
||||
<span id="25">25</span>
|
||||
<span id="26">26</span>
|
||||
<span id="27">27</span>
|
||||
<span id="28">28</span>
|
||||
<span id="29">29</span>
|
||||
<span id="30">30</span>
|
||||
<span id="31">31</span>
|
||||
<span id="32">32</span>
|
||||
<span id="33">33</span>
|
||||
<span id="34">34</span>
|
||||
<span id="35">35</span>
|
||||
<span id="36">36</span>
|
||||
<span id="37">37</span>
|
||||
<span id="38">38</span>
|
||||
<span id="39">39</span>
|
||||
<span id="40">40</span>
|
||||
<span id="41">41</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2019 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
|
||||
<span class="doccomment">//! Support for lookups based on minimal perfect hashing.</span>
|
||||
|
||||
<span class="comment">// This function is based on multiplication being fast and is "good enough". Also</span>
|
||||
<span class="comment">// it can share some work between the unsalted and salted versions.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">my_hash</span>(<span class="ident">key</span>: <span class="ident">u32</span>, <span class="ident">salt</span>: <span class="ident">u32</span>, <span class="ident">n</span>: <span class="ident">usize</span>) <span class="op">-</span><span class="op">></span> <span class="ident">usize</span> {
|
||||
<span class="kw">let</span> <span class="ident">y</span> <span class="op">=</span> <span class="ident">key</span>.<span class="ident">wrapping_add</span>(<span class="ident">salt</span>).<span class="ident">wrapping_mul</span>(<span class="number">2654435769</span>);
|
||||
<span class="kw">let</span> <span class="ident">y</span> <span class="op">=</span> <span class="ident">y</span> <span class="op">^</span> <span class="ident">key</span>.<span class="ident">wrapping_mul</span>(<span class="number">0x31415926</span>);
|
||||
(((<span class="ident">y</span> <span class="kw">as</span> <span class="ident">u64</span>) <span class="op">*</span> (<span class="ident">n</span> <span class="kw">as</span> <span class="ident">u64</span>)) <span class="op">></span><span class="op">></span> <span class="number">32</span>) <span class="kw">as</span> <span class="ident">usize</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Do a lookup using minimal perfect hashing.</span>
|
||||
<span class="doccomment">/// </span>
|
||||
<span class="doccomment">/// The table is stored as a sequence of "salt" values, then a sequence of</span>
|
||||
<span class="doccomment">/// values that contain packed key/value pairs. The strategy is to hash twice.</span>
|
||||
<span class="doccomment">/// The first hash retrieves a salt value that makes the second hash unique.</span>
|
||||
<span class="doccomment">/// The hash function doesn't have to be very good, just good enough that the</span>
|
||||
<span class="doccomment">/// resulting map is unique.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">mph_lookup</span><span class="op"><</span><span class="ident">KV</span>, <span class="ident">V</span>, <span class="ident">FK</span>, <span class="ident">FV</span><span class="op">></span>(<span class="ident">x</span>: <span class="ident">u32</span>, <span class="ident">salt</span>: <span class="kw-2">&</span>[<span class="ident">u16</span>], <span class="ident">kv</span>: <span class="kw-2">&</span>[<span class="ident">KV</span>], <span class="ident">fk</span>: <span class="ident">FK</span>, <span class="ident">fv</span>: <span class="ident">FV</span>,
|
||||
<span class="ident">default</span>: <span class="ident">V</span>) <span class="op">-</span><span class="op">></span> <span class="ident">V</span>
|
||||
<span class="kw">where</span> <span class="ident">KV</span>: <span class="ident">Copy</span>, <span class="ident">FK</span>: <span class="ident">Fn</span>(<span class="ident">KV</span>) <span class="op">-</span><span class="op">></span> <span class="ident">u32</span>, <span class="ident">FV</span>: <span class="ident">Fn</span>(<span class="ident">KV</span>) <span class="op">-</span><span class="op">></span> <span class="ident">V</span>
|
||||
{
|
||||
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">salt</span>[<span class="ident">my_hash</span>(<span class="ident">x</span>, <span class="number">0</span>, <span class="ident">salt</span>.<span class="ident">len</span>())] <span class="kw">as</span> <span class="ident">u32</span>;
|
||||
<span class="kw">let</span> <span class="ident">key_val</span> <span class="op">=</span> <span class="ident">kv</span>[<span class="ident">my_hash</span>(<span class="ident">x</span>, <span class="ident">s</span>, <span class="ident">salt</span>.<span class="ident">len</span>())];
|
||||
<span class="kw">if</span> <span class="ident">x</span> <span class="op">=</span><span class="op">=</span> <span class="ident">fk</span>(<span class="ident">key_val</span>) {
|
||||
<span class="ident">fv</span>(<span class="ident">key_val</span>)
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">default</span>
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
383
src/unicode_normalization/quick_check.rs.html
Normal file
383
src/unicode_normalization/quick_check.rs.html
Normal file
@@ -0,0 +1,383 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/quick_check.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>quick_check.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
<span id="154">154</span>
|
||||
<span id="155">155</span>
|
||||
<span id="156">156</span>
|
||||
<span id="157">157</span>
|
||||
<span id="158">158</span>
|
||||
<span id="159">159</span>
|
||||
<span id="160">160</span>
|
||||
<span id="161">161</span>
|
||||
<span id="162">162</span>
|
||||
<span id="163">163</span>
|
||||
<span id="164">164</span>
|
||||
<span id="165">165</span>
|
||||
<span id="166">166</span>
|
||||
<span id="167">167</span>
|
||||
<span id="168">168</span>
|
||||
<span id="169">169</span>
|
||||
<span id="170">170</span>
|
||||
<span id="171">171</span>
|
||||
<span id="172">172</span>
|
||||
<span id="173">173</span>
|
||||
<span id="174">174</span>
|
||||
<span id="175">175</span>
|
||||
<span id="176">176</span>
|
||||
<span id="177">177</span>
|
||||
<span id="178">178</span>
|
||||
<span id="179">179</span>
|
||||
<span id="180">180</span>
|
||||
<span id="181">181</span>
|
||||
<span id="182">182</span>
|
||||
<span id="183">183</span>
|
||||
<span id="184">184</span>
|
||||
<span id="185">185</span>
|
||||
<span id="186">186</span>
|
||||
<span id="187">187</span>
|
||||
<span id="188">188</span>
|
||||
<span id="189">189</span>
|
||||
<span id="190">190</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="kw">use</span> <span class="ident">UnicodeNormalization</span>;
|
||||
<span class="kw">use</span> <span class="ident">lookups</span>::<span class="ident">canonical_combining_class</span>;
|
||||
<span class="kw">use</span> <span class="ident">stream_safe</span>;
|
||||
<span class="kw">use</span> <span class="ident">tables</span>;
|
||||
|
||||
<span class="doccomment">/// The QuickCheck algorithm can quickly determine if a text is or isn't</span>
|
||||
<span class="doccomment">/// normalized without any allocations in many cases, but it has to be able to</span>
|
||||
<span class="doccomment">/// return `Maybe` when a full decomposition and recomposition is necessary.</span>
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Eq</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">IsNormalized</span> {
|
||||
<span class="doccomment">/// The text is definitely normalized.</span>
|
||||
<span class="ident">Yes</span>,
|
||||
<span class="doccomment">/// The text is definitely not normalized.</span>
|
||||
<span class="ident">No</span>,
|
||||
<span class="doccomment">/// The text may be normalized.</span>
|
||||
<span class="ident">Maybe</span>,
|
||||
}
|
||||
|
||||
<span class="comment">// https://unicode.org/reports/tr15/#Detecting_Normalization_Forms</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">quick_check</span><span class="op"><</span><span class="ident">F</span>, <span class="ident">I</span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>, <span class="ident">is_allowed</span>: <span class="ident">F</span>, <span class="ident">stream_safe</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span>
|
||||
<span class="kw">where</span> <span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span>, <span class="ident">F</span>: <span class="ident">Fn</span>(<span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span>
|
||||
{
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">last_cc</span> <span class="op">=</span> <span class="number">0u8</span>;
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">nonstarter_count</span> <span class="op">=</span> <span class="number">0</span>;
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">result</span> <span class="op">=</span> <span class="ident">IsNormalized</span>::<span class="ident">Yes</span>;
|
||||
<span class="kw">for</span> <span class="ident">ch</span> <span class="kw">in</span> <span class="ident">s</span> {
|
||||
<span class="comment">// For ASCII we know it's always allowed and a starter</span>
|
||||
<span class="kw">if</span> <span class="ident">ch</span> <span class="op"><</span><span class="op">=</span> <span class="string">'\x7f'</span> {
|
||||
<span class="ident">last_cc</span> <span class="op">=</span> <span class="number">0</span>;
|
||||
<span class="ident">nonstarter_count</span> <span class="op">=</span> <span class="number">0</span>;
|
||||
<span class="kw">continue</span>;
|
||||
}
|
||||
|
||||
<span class="comment">// Otherwise, lookup the combining class and QC property</span>
|
||||
<span class="kw">let</span> <span class="ident">cc</span> <span class="op">=</span> <span class="ident">canonical_combining_class</span>(<span class="ident">ch</span>);
|
||||
<span class="kw">if</span> <span class="ident">last_cc</span> <span class="op">></span> <span class="ident">cc</span> <span class="kw-2">&</span><span class="op">&</span> <span class="ident">cc</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="kw">return</span> <span class="ident">IsNormalized</span>::<span class="ident">No</span>;
|
||||
}
|
||||
<span class="kw">match</span> <span class="ident">is_allowed</span>(<span class="ident">ch</span>) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> (),
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="ident">IsNormalized</span>::<span class="ident">No</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="ident">result</span> <span class="op">=</span> <span class="ident">IsNormalized</span>::<span class="ident">Maybe</span>;
|
||||
},
|
||||
}
|
||||
<span class="kw">if</span> <span class="ident">stream_safe</span> {
|
||||
<span class="kw">let</span> <span class="ident">decomp</span> <span class="op">=</span> <span class="ident">stream_safe</span>::<span class="ident">classify_nonstarters</span>(<span class="ident">ch</span>);
|
||||
|
||||
<span class="comment">// If we're above `MAX_NONSTARTERS`, we're definitely *not*</span>
|
||||
<span class="comment">// stream-safe normalized.</span>
|
||||
<span class="kw">if</span> <span class="ident">nonstarter_count</span> <span class="op">+</span> <span class="ident">decomp</span>.<span class="ident">leading_nonstarters</span> <span class="op">></span> <span class="ident">stream_safe</span>::<span class="ident">MAX_NONSTARTERS</span> {
|
||||
<span class="kw">return</span> <span class="ident">IsNormalized</span>::<span class="ident">No</span>;
|
||||
}
|
||||
<span class="kw">if</span> <span class="ident">decomp</span>.<span class="ident">leading_nonstarters</span> <span class="op">=</span><span class="op">=</span> <span class="ident">decomp</span>.<span class="ident">decomposition_len</span> {
|
||||
<span class="ident">nonstarter_count</span> <span class="op">+</span><span class="op">=</span> <span class="ident">decomp</span>.<span class="ident">decomposition_len</span>;
|
||||
} <span class="kw">else</span> {
|
||||
<span class="ident">nonstarter_count</span> <span class="op">=</span> <span class="ident">decomp</span>.<span class="ident">trailing_nonstarters</span>;
|
||||
}
|
||||
}
|
||||
<span class="ident">last_cc</span> <span class="op">=</span> <span class="ident">cc</span>;
|
||||
}
|
||||
<span class="ident">result</span>
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is in NFC, potentially returning</span>
|
||||
<span class="doccomment">/// `IsNormalized::Maybe` if further checks are necessary. In this case a check</span>
|
||||
<span class="doccomment">/// like `s.chars().nfc().eq(s.chars())` should suffice.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfc_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfc</span>, <span class="bool-val">false</span>)
|
||||
}
|
||||
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is in NFKC.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfkc_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfkc</span>, <span class="bool-val">false</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is in NFD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfd_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfd</span>, <span class="bool-val">false</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is in NFKD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfkd_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfkd</span>, <span class="bool-val">false</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is Stream-Safe NFC.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfc_stream_safe_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfc</span>, <span class="bool-val">true</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Quickly check if a string is Stream-Safe NFD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfd_stream_safe_quick</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">s</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">IsNormalized</span> {
|
||||
<span class="ident">quick_check</span>(<span class="ident">s</span>, <span class="ident">tables</span>::<span class="ident">qc_nfd</span>, <span class="bool-val">true</span>)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is in NFC.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfc</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfc_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">nfc</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is in NFKC.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfkc</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfkc_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">nfkc</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is in NFD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfd</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfd_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">nfd</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is in NFKD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfkd</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfkd_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">nfkd</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is Stream-Safe NFC.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfc_stream_safe</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfc_stream_safe_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">stream_safe</span>().<span class="ident">nfc</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Authoritatively check if a string is Stream-Safe NFD.</span>
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">is_nfd_stream_safe</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||
<span class="kw">match</span> <span class="ident">is_nfd_stream_safe_quick</span>(<span class="ident">s</span>.<span class="ident">chars</span>()) {
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Yes</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">true</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">No</span> <span class="op">=</span><span class="op">></span> <span class="bool-val">false</span>,
|
||||
<span class="ident">IsNormalized</span>::<span class="ident">Maybe</span> <span class="op">=</span><span class="op">></span> <span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">eq</span>(<span class="ident">s</span>.<span class="ident">chars</span>().<span class="ident">stream_safe</span>().<span class="ident">nfd</span>()),
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
|
||||
<span class="kw">mod</span> <span class="ident">tests</span> {
|
||||
<span class="kw">use</span> <span class="kw">super</span>::{
|
||||
<span class="ident">IsNormalized</span>,
|
||||
<span class="ident">is_nfc_stream_safe_quick</span>,
|
||||
<span class="ident">is_nfd_stream_safe_quick</span>,
|
||||
};
|
||||
|
||||
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">test_stream_safe_nfd</span>() {
|
||||
<span class="kw">let</span> <span class="ident">okay</span> <span class="op">=</span> <span class="string">"Da\u{031b}\u{0316}\u{0317}\u{0318}\u{0319}\u{031c}\u{031d}\u{0300}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{031a}ngerzone"</span>;
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">is_nfd_stream_safe_quick</span>(<span class="ident">okay</span>.<span class="ident">chars</span>()), <span class="ident">IsNormalized</span>::<span class="ident">Yes</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">too_much</span> <span class="op">=</span> <span class="string">"Da\u{031b}\u{0316}\u{0317}\u{0318}\u{0319}\u{031c}\u{031d}\u{031e}\u{0300}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{031a}ngerzone"</span>;
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">is_nfd_stream_safe_quick</span>(<span class="ident">too_much</span>.<span class="ident">chars</span>()), <span class="ident">IsNormalized</span>::<span class="ident">No</span>);
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">test_stream_safe_nfc</span>() {
|
||||
<span class="kw">let</span> <span class="ident">okay</span> <span class="op">=</span> <span class="string">"ok\u{e0}\u{031b}\u{0316}\u{0317}\u{0318}\u{0319}\u{031c}\u{031d}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{031a}y"</span>;
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">is_nfc_stream_safe_quick</span>(<span class="ident">okay</span>.<span class="ident">chars</span>()), <span class="ident">IsNormalized</span>::<span class="ident">Maybe</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">too_much</span> <span class="op">=</span> <span class="string">"not ok\u{e0}\u{031b}\u{0316}\u{0317}\u{0318}\u{0319}\u{031c}\u{031d}\u{031e}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{031a}y"</span>;
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">is_nfc_stream_safe_quick</span>(<span class="ident">too_much</span>.<span class="ident">chars</span>()), <span class="ident">IsNormalized</span>::<span class="ident">No</span>);
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
323
src/unicode_normalization/recompose.rs.html
Normal file
323
src/unicode_normalization/recompose.rs.html
Normal file
@@ -0,0 +1,323 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/recompose.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>recompose.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
<span id="154">154</span>
|
||||
<span id="155">155</span>
|
||||
<span id="156">156</span>
|
||||
<span id="157">157</span>
|
||||
<span id="158">158</span>
|
||||
<span id="159">159</span>
|
||||
<span id="160">160</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="comment">// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT</span>
|
||||
<span class="comment">// file at the top-level directory of this distribution and at</span>
|
||||
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or</span>
|
||||
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license</span>
|
||||
<span class="comment">// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your</span>
|
||||
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
|
||||
<span class="comment">// except according to those terms.</span>
|
||||
|
||||
<span class="kw">use</span> <span class="ident">decompose</span>::<span class="ident">Decompositions</span>;
|
||||
<span class="kw">use</span> <span class="ident">smallvec</span>::<span class="ident">SmallVec</span>;
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fmt</span>::{<span class="self">self</span>, <span class="ident">Write</span>};
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||
<span class="kw">enum</span> <span class="ident">RecompositionState</span> {
|
||||
<span class="ident">Composing</span>,
|
||||
<span class="ident">Purging</span>(<span class="ident">usize</span>),
|
||||
<span class="ident">Finished</span>(<span class="ident">usize</span>),
|
||||
}
|
||||
|
||||
<span class="doccomment">/// External iterator for a string recomposition's characters.</span>
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">iter</span>: <span class="ident">Decompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span>,
|
||||
<span class="ident">state</span>: <span class="ident">RecompositionState</span>,
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span><span class="op"><</span>[<span class="ident">char</span>; <span class="number">4</span>]<span class="op">></span>,
|
||||
<span class="ident">composee</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span>,
|
||||
<span class="ident">last_ccc</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">u8</span><span class="op">></span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new_canonical</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">iter</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">Recompositions</span> {
|
||||
<span class="ident">iter</span>: <span class="kw">super</span>::<span class="ident">decompose</span>::<span class="ident">new_canonical</span>(<span class="ident">iter</span>),
|
||||
<span class="ident">state</span>: <span class="self">self</span>::<span class="ident">RecompositionState</span>::<span class="ident">Composing</span>,
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
|
||||
<span class="ident">composee</span>: <span class="prelude-val">None</span>,
|
||||
<span class="ident">last_ccc</span>: <span class="prelude-val">None</span>,
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new_compatible</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span>(<span class="ident">iter</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">Recompositions</span> {
|
||||
<span class="ident">iter</span>: <span class="kw">super</span>::<span class="ident">decompose</span>::<span class="ident">new_compatible</span>(<span class="ident">iter</span>),
|
||||
<span class="ident">state</span>: <span class="self">self</span>::<span class="ident">RecompositionState</span>::<span class="ident">Composing</span>,
|
||||
<span class="ident">buffer</span>: <span class="ident">SmallVec</span>::<span class="ident">new</span>(),
|
||||
<span class="ident">composee</span>: <span class="prelude-val">None</span>,
|
||||
<span class="ident">last_ccc</span>: <span class="prelude-val">None</span>,
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span> <span class="ident">Iterator</span> <span class="kw">for</span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">type</span> <span class="ident">Item</span> <span class="op">=</span> <span class="ident">char</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">next</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="kw">use</span> <span class="self">self</span>::<span class="ident">RecompositionState</span>::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="kw">loop</span> {
|
||||
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">state</span> {
|
||||
<span class="ident">Composing</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">for</span> <span class="ident">ch</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">iter</span>.<span class="ident">by_ref</span>() {
|
||||
<span class="kw">let</span> <span class="ident">ch_class</span> <span class="op">=</span> <span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">canonical_combining_class</span>(<span class="ident">ch</span>);
|
||||
<span class="kw">let</span> <span class="ident">k</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">composee</span> {
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">ch_class</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>);
|
||||
}
|
||||
<span class="self">self</span>.<span class="ident">composee</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>);
|
||||
<span class="kw">continue</span>;
|
||||
},
|
||||
<span class="prelude-val">Some</span>(<span class="ident">k</span>) <span class="op">=</span><span class="op">></span> <span class="ident">k</span>,
|
||||
};
|
||||
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">last_ccc</span> {
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">match</span> <span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">compose</span>(<span class="ident">k</span>, <span class="ident">ch</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">composee</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">r</span>);
|
||||
<span class="kw">continue</span>;
|
||||
}
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">ch_class</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="self">self</span>.<span class="ident">composee</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">k</span>);
|
||||
}
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">push</span>(<span class="ident">ch</span>);
|
||||
<span class="self">self</span>.<span class="ident">last_ccc</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch_class</span>);
|
||||
}
|
||||
}
|
||||
}
|
||||
<span class="prelude-val">Some</span>(<span class="ident">l_class</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="ident">l_class</span> <span class="op">></span><span class="op">=</span> <span class="ident">ch_class</span> {
|
||||
<span class="comment">// `ch` is blocked from `composee`</span>
|
||||
<span class="kw">if</span> <span class="ident">ch_class</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> {
|
||||
<span class="self">self</span>.<span class="ident">composee</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>);
|
||||
<span class="self">self</span>.<span class="ident">last_ccc</span> <span class="op">=</span> <span class="prelude-val">None</span>;
|
||||
<span class="self">self</span>.<span class="ident">state</span> <span class="op">=</span> <span class="ident">Purging</span>(<span class="number">0</span>);
|
||||
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">k</span>);
|
||||
}
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">push</span>(<span class="ident">ch</span>);
|
||||
<span class="self">self</span>.<span class="ident">last_ccc</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch_class</span>);
|
||||
<span class="kw">continue</span>;
|
||||
}
|
||||
<span class="kw">match</span> <span class="kw">super</span>::<span class="ident">char</span>::<span class="ident">compose</span>(<span class="ident">k</span>, <span class="ident">ch</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">r</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">composee</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">r</span>);
|
||||
<span class="kw">continue</span>;
|
||||
}
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">push</span>(<span class="ident">ch</span>);
|
||||
<span class="self">self</span>.<span class="ident">last_ccc</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">ch_class</span>);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
<span class="self">self</span>.<span class="ident">state</span> <span class="op">=</span> <span class="ident">Finished</span>(<span class="number">0</span>);
|
||||
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">composee</span>.<span class="ident">is_some</span>() {
|
||||
<span class="kw">return</span> <span class="self">self</span>.<span class="ident">composee</span>.<span class="ident">take</span>();
|
||||
}
|
||||
}
|
||||
<span class="ident">Purging</span>(<span class="ident">next</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">get</span>(<span class="ident">next</span>).<span class="ident">cloned</span>() {
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">clear</span>();
|
||||
<span class="self">self</span>.<span class="ident">state</span> <span class="op">=</span> <span class="ident">Composing</span>;
|
||||
}
|
||||
<span class="ident">s</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">state</span> <span class="op">=</span> <span class="ident">Purging</span>(<span class="ident">next</span> <span class="op">+</span> <span class="number">1</span>);
|
||||
<span class="kw">return</span> <span class="ident">s</span>
|
||||
}
|
||||
}
|
||||
}
|
||||
<span class="ident">Finished</span>(<span class="ident">next</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">get</span>(<span class="ident">next</span>).<span class="ident">cloned</span>() {
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">clear</span>();
|
||||
<span class="kw">return</span> <span class="self">self</span>.<span class="ident">composee</span>.<span class="ident">take</span>()
|
||||
}
|
||||
<span class="ident">s</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="self">self</span>.<span class="ident">state</span> <span class="op">=</span> <span class="ident">Finished</span>(<span class="ident">next</span> <span class="op">+</span> <span class="number">1</span>);
|
||||
<span class="kw">return</span> <span class="ident">s</span>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span> <span class="op">+</span> <span class="ident">Clone</span><span class="op">></span> <span class="ident">fmt</span>::<span class="ident">Display</span> <span class="kw">for</span> <span class="ident">Recompositions</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span>) <span class="op">-</span><span class="op">></span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
|
||||
<span class="kw">for</span> <span class="ident">c</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">clone</span>() {
|
||||
<span class="ident">f</span>.<span class="ident">write_char</span>(<span class="ident">c</span>)<span class="question-mark">?</span>;
|
||||
}
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
319
src/unicode_normalization/stream_safe.rs.html
Normal file
319
src/unicode_normalization/stream_safe.rs.html
Normal file
@@ -0,0 +1,319 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/unicode-normalization-0.1.12/src/stream_safe.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>stream_safe.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="https://unicode-rs.github.io/unicode-rs_sm.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">☰</div><a href='../../unicode_normalization/index.html'><div class='logo-container'><img src='https://unicode-rs.github.io/unicode-rs_sm.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
|
||||
<span id="2"> 2</span>
|
||||
<span id="3"> 3</span>
|
||||
<span id="4"> 4</span>
|
||||
<span id="5"> 5</span>
|
||||
<span id="6"> 6</span>
|
||||
<span id="7"> 7</span>
|
||||
<span id="8"> 8</span>
|
||||
<span id="9"> 9</span>
|
||||
<span id="10"> 10</span>
|
||||
<span id="11"> 11</span>
|
||||
<span id="12"> 12</span>
|
||||
<span id="13"> 13</span>
|
||||
<span id="14"> 14</span>
|
||||
<span id="15"> 15</span>
|
||||
<span id="16"> 16</span>
|
||||
<span id="17"> 17</span>
|
||||
<span id="18"> 18</span>
|
||||
<span id="19"> 19</span>
|
||||
<span id="20"> 20</span>
|
||||
<span id="21"> 21</span>
|
||||
<span id="22"> 22</span>
|
||||
<span id="23"> 23</span>
|
||||
<span id="24"> 24</span>
|
||||
<span id="25"> 25</span>
|
||||
<span id="26"> 26</span>
|
||||
<span id="27"> 27</span>
|
||||
<span id="28"> 28</span>
|
||||
<span id="29"> 29</span>
|
||||
<span id="30"> 30</span>
|
||||
<span id="31"> 31</span>
|
||||
<span id="32"> 32</span>
|
||||
<span id="33"> 33</span>
|
||||
<span id="34"> 34</span>
|
||||
<span id="35"> 35</span>
|
||||
<span id="36"> 36</span>
|
||||
<span id="37"> 37</span>
|
||||
<span id="38"> 38</span>
|
||||
<span id="39"> 39</span>
|
||||
<span id="40"> 40</span>
|
||||
<span id="41"> 41</span>
|
||||
<span id="42"> 42</span>
|
||||
<span id="43"> 43</span>
|
||||
<span id="44"> 44</span>
|
||||
<span id="45"> 45</span>
|
||||
<span id="46"> 46</span>
|
||||
<span id="47"> 47</span>
|
||||
<span id="48"> 48</span>
|
||||
<span id="49"> 49</span>
|
||||
<span id="50"> 50</span>
|
||||
<span id="51"> 51</span>
|
||||
<span id="52"> 52</span>
|
||||
<span id="53"> 53</span>
|
||||
<span id="54"> 54</span>
|
||||
<span id="55"> 55</span>
|
||||
<span id="56"> 56</span>
|
||||
<span id="57"> 57</span>
|
||||
<span id="58"> 58</span>
|
||||
<span id="59"> 59</span>
|
||||
<span id="60"> 60</span>
|
||||
<span id="61"> 61</span>
|
||||
<span id="62"> 62</span>
|
||||
<span id="63"> 63</span>
|
||||
<span id="64"> 64</span>
|
||||
<span id="65"> 65</span>
|
||||
<span id="66"> 66</span>
|
||||
<span id="67"> 67</span>
|
||||
<span id="68"> 68</span>
|
||||
<span id="69"> 69</span>
|
||||
<span id="70"> 70</span>
|
||||
<span id="71"> 71</span>
|
||||
<span id="72"> 72</span>
|
||||
<span id="73"> 73</span>
|
||||
<span id="74"> 74</span>
|
||||
<span id="75"> 75</span>
|
||||
<span id="76"> 76</span>
|
||||
<span id="77"> 77</span>
|
||||
<span id="78"> 78</span>
|
||||
<span id="79"> 79</span>
|
||||
<span id="80"> 80</span>
|
||||
<span id="81"> 81</span>
|
||||
<span id="82"> 82</span>
|
||||
<span id="83"> 83</span>
|
||||
<span id="84"> 84</span>
|
||||
<span id="85"> 85</span>
|
||||
<span id="86"> 86</span>
|
||||
<span id="87"> 87</span>
|
||||
<span id="88"> 88</span>
|
||||
<span id="89"> 89</span>
|
||||
<span id="90"> 90</span>
|
||||
<span id="91"> 91</span>
|
||||
<span id="92"> 92</span>
|
||||
<span id="93"> 93</span>
|
||||
<span id="94"> 94</span>
|
||||
<span id="95"> 95</span>
|
||||
<span id="96"> 96</span>
|
||||
<span id="97"> 97</span>
|
||||
<span id="98"> 98</span>
|
||||
<span id="99"> 99</span>
|
||||
<span id="100">100</span>
|
||||
<span id="101">101</span>
|
||||
<span id="102">102</span>
|
||||
<span id="103">103</span>
|
||||
<span id="104">104</span>
|
||||
<span id="105">105</span>
|
||||
<span id="106">106</span>
|
||||
<span id="107">107</span>
|
||||
<span id="108">108</span>
|
||||
<span id="109">109</span>
|
||||
<span id="110">110</span>
|
||||
<span id="111">111</span>
|
||||
<span id="112">112</span>
|
||||
<span id="113">113</span>
|
||||
<span id="114">114</span>
|
||||
<span id="115">115</span>
|
||||
<span id="116">116</span>
|
||||
<span id="117">117</span>
|
||||
<span id="118">118</span>
|
||||
<span id="119">119</span>
|
||||
<span id="120">120</span>
|
||||
<span id="121">121</span>
|
||||
<span id="122">122</span>
|
||||
<span id="123">123</span>
|
||||
<span id="124">124</span>
|
||||
<span id="125">125</span>
|
||||
<span id="126">126</span>
|
||||
<span id="127">127</span>
|
||||
<span id="128">128</span>
|
||||
<span id="129">129</span>
|
||||
<span id="130">130</span>
|
||||
<span id="131">131</span>
|
||||
<span id="132">132</span>
|
||||
<span id="133">133</span>
|
||||
<span id="134">134</span>
|
||||
<span id="135">135</span>
|
||||
<span id="136">136</span>
|
||||
<span id="137">137</span>
|
||||
<span id="138">138</span>
|
||||
<span id="139">139</span>
|
||||
<span id="140">140</span>
|
||||
<span id="141">141</span>
|
||||
<span id="142">142</span>
|
||||
<span id="143">143</span>
|
||||
<span id="144">144</span>
|
||||
<span id="145">145</span>
|
||||
<span id="146">146</span>
|
||||
<span id="147">147</span>
|
||||
<span id="148">148</span>
|
||||
<span id="149">149</span>
|
||||
<span id="150">150</span>
|
||||
<span id="151">151</span>
|
||||
<span id="152">152</span>
|
||||
<span id="153">153</span>
|
||||
<span id="154">154</span>
|
||||
<span id="155">155</span>
|
||||
<span id="156">156</span>
|
||||
<span id="157">157</span>
|
||||
<span id="158">158</span>
|
||||
</pre><div class="example-wrap"><pre class="rust ">
|
||||
<span class="kw">use</span> <span class="ident">normalize</span>::{
|
||||
<span class="ident">hangul_decomposition_length</span>,
|
||||
<span class="ident">is_hangul_syllable</span>,
|
||||
};
|
||||
<span class="kw">use</span> <span class="ident">lookups</span>::{
|
||||
<span class="ident">canonical_combining_class</span>, <span class="ident">canonical_fully_decomposed</span>, <span class="ident">compatibility_fully_decomposed</span>,
|
||||
<span class="ident">stream_safe_trailing_nonstarters</span>,
|
||||
};
|
||||
<span class="kw">use</span> <span class="ident">tables</span>::<span class="ident">stream_safe_leading_nonstarters</span>;
|
||||
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const</span> <span class="ident">MAX_NONSTARTERS</span>: <span class="ident">usize</span> <span class="op">=</span> <span class="number">30</span>;
|
||||
<span class="kw">const</span> <span class="ident">COMBINING_GRAPHEME_JOINER</span>: <span class="ident">char</span> <span class="op">=</span> <span class="string">'\u{034F}'</span>;
|
||||
|
||||
<span class="doccomment">/// UAX15-D4: This iterator keeps track of how many non-starters there have been</span>
|
||||
<span class="doccomment">/// since the last starter in *NFKD* and will emit a Combining Grapheme Joiner</span>
|
||||
<span class="doccomment">/// (U+034F) if the count exceeds 30.</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="ident">iter</span>: <span class="ident">I</span>,
|
||||
<span class="ident">nonstarter_count</span>: <span class="ident">usize</span>,
|
||||
<span class="ident">buffer</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span>,
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">iter</span>: <span class="ident">I</span>) <span class="op">-</span><span class="op">></span> <span class="self">Self</span> {
|
||||
<span class="self">Self</span> { <span class="ident">iter</span>, <span class="ident">nonstarter_count</span>: <span class="number">0</span>, <span class="ident">buffer</span>: <span class="prelude-val">None</span> }
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">I</span>: <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span><span class="op">=</span><span class="ident">char</span><span class="op">></span><span class="op">></span> <span class="ident">Iterator</span> <span class="kw">for</span> <span class="ident">StreamSafe</span><span class="op"><</span><span class="ident">I</span><span class="op">></span> {
|
||||
<span class="kw">type</span> <span class="ident">Item</span> <span class="op">=</span> <span class="ident">char</span>;
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">next</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">char</span><span class="op">></span> {
|
||||
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">buffer</span>.<span class="ident">take</span>() {
|
||||
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>);
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">next_ch</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">iter</span>.<span class="ident">next</span>() {
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="kw">return</span> <span class="prelude-val">None</span>,
|
||||
<span class="prelude-val">Some</span>(<span class="ident">c</span>) <span class="op">=</span><span class="op">></span> <span class="ident">c</span>,
|
||||
};
|
||||
<span class="kw">let</span> <span class="ident">d</span> <span class="op">=</span> <span class="ident">classify_nonstarters</span>(<span class="ident">next_ch</span>);
|
||||
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">nonstarter_count</span> <span class="op">+</span> <span class="ident">d</span>.<span class="ident">leading_nonstarters</span> <span class="op">></span> <span class="ident">MAX_NONSTARTERS</span> {
|
||||
<span class="self">self</span>.<span class="ident">buffer</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">next_ch</span>);
|
||||
<span class="self">self</span>.<span class="ident">nonstarter_count</span> <span class="op">=</span> <span class="number">0</span>;
|
||||
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">COMBINING_GRAPHEME_JOINER</span>);
|
||||
}
|
||||
|
||||
<span class="comment">// No starters in the decomposition, so keep accumulating</span>
|
||||
<span class="kw">if</span> <span class="ident">d</span>.<span class="ident">leading_nonstarters</span> <span class="op">=</span><span class="op">=</span> <span class="ident">d</span>.<span class="ident">decomposition_len</span> {
|
||||
<span class="self">self</span>.<span class="ident">nonstarter_count</span> <span class="op">+</span><span class="op">=</span> <span class="ident">d</span>.<span class="ident">decomposition_len</span>;
|
||||
}
|
||||
<span class="comment">// Otherwise, restart the nonstarter counter.</span>
|
||||
<span class="kw">else</span> {
|
||||
<span class="self">self</span>.<span class="ident">nonstarter_count</span> <span class="op">=</span> <span class="ident">d</span>.<span class="ident">trailing_nonstarters</span>;
|
||||
}
|
||||
<span class="prelude-val">Some</span>(<span class="ident">next_ch</span>)
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct</span> <span class="ident">Decomposition</span> {
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">leading_nonstarters</span>: <span class="ident">usize</span>,
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">trailing_nonstarters</span>: <span class="ident">usize</span>,
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="ident">decomposition_len</span>: <span class="ident">usize</span>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">inline</span>]</span>
|
||||
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">classify_nonstarters</span>(<span class="ident">c</span>: <span class="ident">char</span>) <span class="op">-</span><span class="op">></span> <span class="ident">Decomposition</span> {
|
||||
<span class="comment">// As usual, fast path for ASCII (which is always a starter)</span>
|
||||
<span class="kw">if</span> <span class="ident">c</span> <span class="op"><</span><span class="op">=</span> <span class="string">'\x7f'</span> {
|
||||
<span class="kw">return</span> <span class="ident">Decomposition</span> {
|
||||
<span class="ident">leading_nonstarters</span>: <span class="number">0</span>,
|
||||
<span class="ident">trailing_nonstarters</span>: <span class="number">0</span>,
|
||||
<span class="ident">decomposition_len</span>: <span class="number">1</span>,
|
||||
}
|
||||
}
|
||||
<span class="comment">// Next, special case Hangul, since it's not handled by our tables.</span>
|
||||
<span class="kw">if</span> <span class="ident">is_hangul_syllable</span>(<span class="ident">c</span>) {
|
||||
<span class="kw">return</span> <span class="ident">Decomposition</span> {
|
||||
<span class="ident">leading_nonstarters</span>: <span class="number">0</span>,
|
||||
<span class="ident">trailing_nonstarters</span>: <span class="number">0</span>,
|
||||
<span class="ident">decomposition_len</span>: <span class="ident">hangul_decomposition_length</span>(<span class="ident">c</span>),
|
||||
};
|
||||
}
|
||||
<span class="kw">let</span> <span class="ident">decomp</span> <span class="op">=</span> <span class="ident">compatibility_fully_decomposed</span>(<span class="ident">c</span>)
|
||||
.<span class="ident">or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">canonical_fully_decomposed</span>(<span class="ident">c</span>));
|
||||
<span class="kw">match</span> <span class="ident">decomp</span> {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">decomp</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="ident">Decomposition</span> {
|
||||
<span class="ident">leading_nonstarters</span>: <span class="ident">stream_safe_leading_nonstarters</span>(<span class="ident">c</span>),
|
||||
<span class="ident">trailing_nonstarters</span>: <span class="ident">stream_safe_trailing_nonstarters</span>(<span class="ident">c</span>),
|
||||
<span class="ident">decomposition_len</span>: <span class="ident">decomp</span>.<span class="ident">len</span>(),
|
||||
}
|
||||
},
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> {
|
||||
<span class="kw">let</span> <span class="ident">is_nonstarter</span> <span class="op">=</span> <span class="ident">canonical_combining_class</span>(<span class="ident">c</span>) <span class="op">!</span><span class="op">=</span> <span class="number">0</span>;
|
||||
<span class="kw">let</span> <span class="ident">nonstarter</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">is_nonstarter</span> { <span class="number">1</span> } <span class="kw">else</span> { <span class="number">0</span> };
|
||||
<span class="ident">Decomposition</span> {
|
||||
<span class="ident">leading_nonstarters</span>: <span class="ident">nonstarter</span>,
|
||||
<span class="ident">trailing_nonstarters</span>: <span class="ident">nonstarter</span>,
|
||||
<span class="ident">decomposition_len</span>: <span class="number">1</span>,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
|
||||
<span class="kw">mod</span> <span class="ident">tests</span> {
|
||||
<span class="kw">use</span> <span class="kw">super</span>::{
|
||||
<span class="ident">StreamSafe</span>,
|
||||
<span class="ident">classify_nonstarters</span>,
|
||||
};
|
||||
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">char</span>;
|
||||
<span class="kw">use</span> <span class="ident">normalize</span>::<span class="ident">decompose_compatible</span>;
|
||||
<span class="kw">use</span> <span class="ident">lookups</span>::<span class="ident">canonical_combining_class</span>;
|
||||
|
||||
<span class="kw">fn</span> <span class="ident">stream_safe</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">String</span> {
|
||||
<span class="ident">StreamSafe</span>::<span class="ident">new</span>(<span class="ident">s</span>.<span class="ident">chars</span>()).<span class="ident">collect</span>()
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">test_simple</span>() {
|
||||
<span class="kw">let</span> <span class="ident">technically_okay</span> <span class="op">=</span> <span class="string">"Da\u{0300}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{0316}\u{0317}\u{0318}\u{0319}\u{031a}\u{031b}\u{031c}\u{031d}ngerzone"</span>;
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">stream_safe</span>(<span class="ident">technically_okay</span>), <span class="ident">technically_okay</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">too_much</span> <span class="op">=</span> <span class="string">"Da\u{0300}\u{0301}\u{0302}\u{0303}\u{0304}\u{0305}\u{0306}\u{0307}\u{0308}\u{0309}\u{030a}\u{030b}\u{030c}\u{030d}\u{030e}\u{030f}\u{0310}\u{0311}\u{0312}\u{0313}\u{0314}\u{0315}\u{0316}\u{0317}\u{0318}\u{0319}\u{031a}\u{031b}\u{031c}\u{031d}\u{032e}ngerzone"</span>;
|
||||
<span class="macro">assert_ne</span><span class="macro">!</span>(<span class="ident">stream_safe</span>(<span class="ident">too_much</span>), <span class="ident">too_much</span>);
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||
<span class="kw">fn</span> <span class="ident">test_classify_nonstarters</span>() {
|
||||
<span class="comment">// Highest character in the `compat_fully_decomp` table is 2FA1D</span>
|
||||
<span class="kw">for</span> <span class="ident">ch</span> <span class="kw">in</span> <span class="number">0</span>..<span class="number">0x2FA1E</span> {
|
||||
<span class="kw">let</span> <span class="ident">ch</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">char</span>::<span class="ident">from_u32</span>(<span class="ident">ch</span>) {
|
||||
<span class="prelude-val">Some</span>(<span class="ident">c</span>) <span class="op">=</span><span class="op">></span> <span class="ident">c</span>,
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="kw">continue</span>,
|
||||
};
|
||||
<span class="kw">let</span> <span class="ident">c</span> <span class="op">=</span> <span class="ident">classify_nonstarters</span>(<span class="ident">ch</span>);
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="macro">vec</span><span class="macro">!</span>[];
|
||||
<span class="ident">decompose_compatible</span>(<span class="ident">ch</span>, <span class="op">|</span><span class="ident">c</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">push</span>(<span class="ident">c</span>));
|
||||
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">s</span>.<span class="ident">len</span>(), <span class="ident">c</span>.<span class="ident">decomposition_len</span>);
|
||||
|
||||
<span class="kw">let</span> <span class="ident">num_leading</span> <span class="op">=</span> <span class="ident">s</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">take_while</span>(<span class="op">|</span><span class="kw-2">&</span><span class="ident">c</span><span class="op">|</span> <span class="ident">canonical_combining_class</span>(<span class="kw-2">*</span><span class="ident">c</span>) <span class="op">!</span><span class="op">=</span> <span class="number">0</span>)
|
||||
.<span class="ident">count</span>();
|
||||
<span class="kw">let</span> <span class="ident">num_trailing</span> <span class="op">=</span> <span class="ident">s</span>
|
||||
.<span class="ident">iter</span>()
|
||||
.<span class="ident">rev</span>()
|
||||
.<span class="ident">take_while</span>(<span class="op">|</span><span class="kw-2">&</span><span class="ident">c</span><span class="op">|</span> <span class="ident">canonical_combining_class</span>(<span class="kw-2">*</span><span class="ident">c</span>) <span class="op">!</span><span class="op">=</span> <span class="number">0</span>)
|
||||
.<span class="ident">count</span>();
|
||||
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">num_leading</span>, <span class="ident">c</span>.<span class="ident">leading_nonstarters</span>);
|
||||
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">num_trailing</span>, <span class="ident">c</span>.<span class="ident">trailing_nonstarters</span>);
|
||||
}
|
||||
}
|
||||
}
|
||||
</pre></div>
|
||||
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "unicode_normalization";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>
|
||||
45563
src/unicode_normalization/tables.rs.html
Normal file
45563
src/unicode_normalization/tables.rs.html
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user