Files
GopherGate/target/doc/src/itoa/lib.rs.html
T
2026-02-26 12:00:21 -05:00

460 lines
51 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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 of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/itoa-1.0.17/src/lib.rs`."><title>lib.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="itoa" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">itoa/</div>lib.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! [![github]](https://github.com/dtolnay/itoa)&amp;ensp;[![crates-io]](https://crates.io/crates/itoa)&amp;ensp;[![docs-rs]](https://docs.rs/itoa)
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&amp;labelColor=555555&amp;logo=github
<a href=#4 id=4 data-nosnippet>4</a>//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&amp;labelColor=555555&amp;logo=rust
<a href=#5 id=5 data-nosnippet>5</a>//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&amp;labelColor=555555&amp;logo=docs.rs
<a href=#6 id=6 data-nosnippet>6</a>//!
<a href=#7 id=7 data-nosnippet>7</a>//! &lt;br&gt;
<a href=#8 id=8 data-nosnippet>8</a>//!
<a href=#9 id=9 data-nosnippet>9</a>//! This crate provides a fast conversion of integer primitives to decimal
<a href=#10 id=10 data-nosnippet>10</a>//! strings. The implementation comes straight from [libcore] but avoids the
<a href=#11 id=11 data-nosnippet>11</a>//! performance penalty of going through [`core::fmt::Formatter`].
<a href=#12 id=12 data-nosnippet>12</a>//!
<a href=#13 id=13 data-nosnippet>13</a>//! See also [`zmij`] for printing floating point primitives.
<a href=#14 id=14 data-nosnippet>14</a>//!
<a href=#15 id=15 data-nosnippet>15</a>//! [libcore]: https://github.com/rust-lang/rust/blob/1.92.0/library/core/src/fmt/num.rs#L190-L253
<a href=#16 id=16 data-nosnippet>16</a>//! [`zmij`]: https://github.com/dtolnay/zmij
<a href=#17 id=17 data-nosnippet>17</a>//!
<a href=#18 id=18 data-nosnippet>18</a>//! # Example
<a href=#19 id=19 data-nosnippet>19</a>//!
<a href=#20 id=20 data-nosnippet>20</a>//! ```
<a href=#21 id=21 data-nosnippet>21</a>//! fn main() {
<a href=#22 id=22 data-nosnippet>22</a>//! let mut buffer = itoa::Buffer::new();
<a href=#23 id=23 data-nosnippet>23</a>//! let printed = buffer.format(128u64);
<a href=#24 id=24 data-nosnippet>24</a>//! assert_eq!(printed, "128");
<a href=#25 id=25 data-nosnippet>25</a>//! }
<a href=#26 id=26 data-nosnippet>26</a>//! ```
<a href=#27 id=27 data-nosnippet>27</a>//!
<a href=#28 id=28 data-nosnippet>28</a>//! # Performance
<a href=#29 id=29 data-nosnippet>29</a>//!
<a href=#30 id=30 data-nosnippet>30</a>//! The [itoa-benchmark] compares this library and other Rust integer formatting
<a href=#31 id=31 data-nosnippet>31</a>//! implementations across a range of integer sizes. The vertical axis in this
<a href=#32 id=32 data-nosnippet>32</a>//! chart shows nanoseconds taken by a single execution of
<a href=#33 id=33 data-nosnippet>33</a>//! `itoa::Buffer::new().format(value)` so a lower result indicates a faster
<a href=#34 id=34 data-nosnippet>34</a>//! library.
<a href=#35 id=35 data-nosnippet>35</a>//!
<a href=#36 id=36 data-nosnippet>36</a>//! [itoa-benchmark]: https://github.com/dtolnay/itoa-benchmark
<a href=#37 id=37 data-nosnippet>37</a>//!
<a href=#38 id=38 data-nosnippet>38</a>//! ![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/itoa-benchmark.png)
<a href=#39 id=39 data-nosnippet>39</a>
<a href=#40 id=40 data-nosnippet>40</a></span><span class="attr">#![doc(html_root_url = <span class="string">"https://docs.rs/itoa/1.0.17"</span>)]
<a href=#41 id=41 data-nosnippet>41</a>#![no_std]
<a href=#42 id=42 data-nosnippet>42</a>#![allow(
<a href=#43 id=43 data-nosnippet>43</a> clippy::cast_lossless,
<a href=#44 id=44 data-nosnippet>44</a> clippy::cast_possible_truncation,
<a href=#45 id=45 data-nosnippet>45</a> clippy::cast_sign_loss,
<a href=#46 id=46 data-nosnippet>46</a> clippy::expl_impl_clone_on_copy,
<a href=#47 id=47 data-nosnippet>47</a> clippy::identity_op,
<a href=#48 id=48 data-nosnippet>48</a> clippy::items_after_statements,
<a href=#49 id=49 data-nosnippet>49</a> clippy::must_use_candidate,
<a href=#50 id=50 data-nosnippet>50</a> clippy::needless_doctest_main,
<a href=#51 id=51 data-nosnippet>51</a> clippy::unreadable_literal
<a href=#52 id=52 data-nosnippet>52</a>)]
<a href=#53 id=53 data-nosnippet>53</a>
<a href=#54 id=54 data-nosnippet>54</a></span><span class="kw">mod </span>u128_ext;
<a href=#55 id=55 data-nosnippet>55</a>
<a href=#56 id=56 data-nosnippet>56</a><span class="kw">use </span>core::hint;
<a href=#57 id=57 data-nosnippet>57</a><span class="kw">use </span>core::mem::{<span class="self">self</span>, MaybeUninit};
<a href=#58 id=58 data-nosnippet>58</a><span class="kw">use </span>core::ptr;
<a href=#59 id=59 data-nosnippet>59</a><span class="kw">use </span>core::str;
<a href=#60 id=60 data-nosnippet>60</a><span class="attr">#[cfg(feature = <span class="string">"no-panic"</span>)]
<a href=#61 id=61 data-nosnippet>61</a></span><span class="kw">use </span>no_panic::no_panic;
<a href=#62 id=62 data-nosnippet>62</a>
<a href=#63 id=63 data-nosnippet>63</a><span class="doccomment">/// A correctly sized stack allocation for the formatted integer to be written
<a href=#64 id=64 data-nosnippet>64</a>/// into.
<a href=#65 id=65 data-nosnippet>65</a>///
<a href=#66 id=66 data-nosnippet>66</a>/// # Example
<a href=#67 id=67 data-nosnippet>67</a>///
<a href=#68 id=68 data-nosnippet>68</a>/// ```
<a href=#69 id=69 data-nosnippet>69</a>/// let mut buffer = itoa::Buffer::new();
<a href=#70 id=70 data-nosnippet>70</a>/// let printed = buffer.format(1234);
<a href=#71 id=71 data-nosnippet>71</a>/// assert_eq!(printed, "1234");
<a href=#72 id=72 data-nosnippet>72</a>/// ```
<a href=#73 id=73 data-nosnippet>73</a></span><span class="kw">pub struct </span>Buffer {
<a href=#74 id=74 data-nosnippet>74</a> bytes: [MaybeUninit&lt;u8&gt;; i128::MAX_STR_LEN],
<a href=#75 id=75 data-nosnippet>75</a>}
<a href=#76 id=76 data-nosnippet>76</a>
<a href=#77 id=77 data-nosnippet>77</a><span class="kw">impl </span>Default <span class="kw">for </span>Buffer {
<a href=#78 id=78 data-nosnippet>78</a> <span class="attr">#[inline]
<a href=#79 id=79 data-nosnippet>79</a> </span><span class="kw">fn </span>default() -&gt; Buffer {
<a href=#80 id=80 data-nosnippet>80</a> Buffer::new()
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a>}
<a href=#83 id=83 data-nosnippet>83</a>
<a href=#84 id=84 data-nosnippet>84</a><span class="kw">impl </span>Copy <span class="kw">for </span>Buffer {}
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a><span class="attr">#[allow(clippy::non_canonical_clone_impl)]
<a href=#87 id=87 data-nosnippet>87</a></span><span class="kw">impl </span>Clone <span class="kw">for </span>Buffer {
<a href=#88 id=88 data-nosnippet>88</a> <span class="attr">#[inline]
<a href=#89 id=89 data-nosnippet>89</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#90 id=90 data-nosnippet>90</a> Buffer::new()
<a href=#91 id=91 data-nosnippet>91</a> }
<a href=#92 id=92 data-nosnippet>92</a>}
<a href=#93 id=93 data-nosnippet>93</a>
<a href=#94 id=94 data-nosnippet>94</a><span class="kw">impl </span>Buffer {
<a href=#95 id=95 data-nosnippet>95</a> <span class="doccomment">/// This is a cheap operation; you don't need to worry about reusing buffers
<a href=#96 id=96 data-nosnippet>96</a> /// for efficiency.
<a href=#97 id=97 data-nosnippet>97</a> </span><span class="attr">#[inline]
<a href=#98 id=98 data-nosnippet>98</a> #[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#99 id=99 data-nosnippet>99</a> </span><span class="kw">pub fn </span>new() -&gt; Buffer {
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let </span>bytes = [MaybeUninit::&lt;u8&gt;::uninit(); i128::MAX_STR_LEN];
<a href=#101 id=101 data-nosnippet>101</a> Buffer { bytes }
<a href=#102 id=102 data-nosnippet>102</a> }
<a href=#103 id=103 data-nosnippet>103</a>
<a href=#104 id=104 data-nosnippet>104</a> <span class="doccomment">/// Print an integer into this buffer and return a reference to its string
<a href=#105 id=105 data-nosnippet>105</a> /// representation within the buffer.
<a href=#106 id=106 data-nosnippet>106</a> </span><span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#107 id=107 data-nosnippet>107</a> </span><span class="kw">pub fn </span>format&lt;I: Integer&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, i: I) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>string = i.write(<span class="kw">unsafe </span>{
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw-2">&amp;mut *</span><span class="macro">ptr::addr_of_mut!</span>(<span class="self">self</span>.bytes).cast::&lt;&lt;I <span class="kw">as </span>private::Sealed&gt;::Buffer&gt;()
<a href=#110 id=110 data-nosnippet>110</a> });
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">if </span>string.len() &gt; I::MAX_STR_LEN {
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw">unsafe </span>{ hint::unreachable_unchecked() };
<a href=#113 id=113 data-nosnippet>113</a> }
<a href=#114 id=114 data-nosnippet>114</a> string
<a href=#115 id=115 data-nosnippet>115</a> }
<a href=#116 id=116 data-nosnippet>116</a>}
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a><span class="doccomment">/// An integer that can be written into an [`itoa::Buffer`][Buffer].
<a href=#119 id=119 data-nosnippet>119</a>///
<a href=#120 id=120 data-nosnippet>120</a>/// This trait is sealed and cannot be implemented for types outside of itoa.
<a href=#121 id=121 data-nosnippet>121</a></span><span class="kw">pub trait </span>Integer: private::Sealed {
<a href=#122 id=122 data-nosnippet>122</a> <span class="doccomment">/// The maximum length of string that formatting an integer of this type can
<a href=#123 id=123 data-nosnippet>123</a> /// produce on the current target platform.
<a href=#124 id=124 data-nosnippet>124</a> </span><span class="kw">const </span>MAX_STR_LEN: usize;
<a href=#125 id=125 data-nosnippet>125</a>}
<a href=#126 id=126 data-nosnippet>126</a>
<a href=#127 id=127 data-nosnippet>127</a><span class="comment">// Seal to prevent downstream implementations of the Integer trait.
<a href=#128 id=128 data-nosnippet>128</a></span><span class="kw">mod </span>private {
<a href=#129 id=129 data-nosnippet>129</a> <span class="attr">#[doc(hidden)]
<a href=#130 id=130 data-nosnippet>130</a> </span><span class="kw">pub trait </span>Sealed: Copy {
<a href=#131 id=131 data-nosnippet>131</a> <span class="attr">#[doc(hidden)]
<a href=#132 id=132 data-nosnippet>132</a> </span><span class="kw">type </span>Buffer: <span class="lifetime">'static</span>;
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">fn </span>write(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; <span class="kw-2">&amp;</span>str;
<a href=#134 id=134 data-nosnippet>134</a> }
<a href=#135 id=135 data-nosnippet>135</a>}
<a href=#136 id=136 data-nosnippet>136</a>
<a href=#137 id=137 data-nosnippet>137</a><span class="macro">macro_rules!</span> impl_Integer {
<a href=#138 id=138 data-nosnippet>138</a> (<span class="macro-nonterminal">$Signed</span>:ident, <span class="macro-nonterminal">$Unsigned</span>:ident) =&gt; {
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">const _</span>: () = {
<a href=#140 id=140 data-nosnippet>140</a> <span class="macro">assert!</span>(<span class="macro-nonterminal">$Signed::MIN </span>&lt; <span class="number">0</span>, <span class="string">"need signed"</span>);
<a href=#141 id=141 data-nosnippet>141</a> <span class="macro">assert!</span>(<span class="macro-nonterminal">$Unsigned::MIN </span>== <span class="number">0</span>, <span class="string">"need unsigned"</span>);
<a href=#142 id=142 data-nosnippet>142</a> <span class="macro">assert!</span>(<span class="macro-nonterminal">$Signed::BITS </span>== <span class="macro-nonterminal">$Unsigned::BITS</span>, <span class="string">"need counterparts"</span>);
<a href=#143 id=143 data-nosnippet>143</a> };
<a href=#144 id=144 data-nosnippet>144</a>
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">impl </span>Integer <span class="kw">for </span><span class="macro-nonterminal">$Unsigned </span>{
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">const </span>MAX_STR_LEN: usize = <span class="macro-nonterminal">$Unsigned::MAX</span>.ilog10() <span class="kw">as </span>usize + <span class="number">1</span>;
<a href=#147 id=147 data-nosnippet>147</a> }
<a href=#148 id=148 data-nosnippet>148</a>
<a href=#149 id=149 data-nosnippet>149</a> <span class="kw">impl </span>private::Sealed <span class="kw">for </span><span class="macro-nonterminal">$Unsigned </span>{
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">type </span>Buffer = [MaybeUninit&lt;u8&gt;; <span class="self">Self</span>::MAX_STR_LEN];
<a href=#151 id=151 data-nosnippet>151</a>
<a href=#152 id=152 data-nosnippet>152</a> <span class="attr">#[inline]
<a href=#153 id=153 data-nosnippet>153</a> #[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#154 id=154 data-nosnippet>154</a> </span><span class="kw">fn </span>write(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#155 id=155 data-nosnippet>155</a> <span class="kw">let </span>offset = Unsigned::fmt(<span class="self">self</span>, buf);
<a href=#156 id=156 data-nosnippet>156</a> <span class="comment">// SAFETY: Starting from `offset`, all elements of the slice have been set.
<a href=#157 id=157 data-nosnippet>157</a> </span><span class="kw">unsafe </span>{ slice_buffer_to_str(buf, offset) }
<a href=#158 id=158 data-nosnippet>158</a> }
<a href=#159 id=159 data-nosnippet>159</a> }
<a href=#160 id=160 data-nosnippet>160</a>
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">impl </span>Integer <span class="kw">for </span><span class="macro-nonterminal">$Signed </span>{
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">const </span>MAX_STR_LEN: usize = <span class="macro-nonterminal">$Signed::MAX</span>.ilog10() <span class="kw">as </span>usize + <span class="number">2</span>;
<a href=#163 id=163 data-nosnippet>163</a> }
<a href=#164 id=164 data-nosnippet>164</a>
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">impl </span>private::Sealed <span class="kw">for </span><span class="macro-nonterminal">$Signed </span>{
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">type </span>Buffer = [MaybeUninit&lt;u8&gt;; <span class="self">Self</span>::MAX_STR_LEN];
<a href=#167 id=167 data-nosnippet>167</a>
<a href=#168 id=168 data-nosnippet>168</a> <span class="attr">#[inline]
<a href=#169 id=169 data-nosnippet>169</a> #[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#170 id=170 data-nosnippet>170</a> </span><span class="kw">fn </span>write(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">let </span><span class="kw-2">mut </span>offset = <span class="self">Self</span>::MAX_STR_LEN - <span class="macro-nonterminal">$Unsigned::MAX_STR_LEN</span>;
<a href=#172 id=172 data-nosnippet>172</a> offset += Unsigned::fmt(
<a href=#173 id=173 data-nosnippet>173</a> <span class="self">self</span>.unsigned_abs(),
<a href=#174 id=174 data-nosnippet>174</a> (<span class="kw-2">&amp;mut </span>buf[offset..]).try_into().unwrap(),
<a href=#175 id=175 data-nosnippet>175</a> );
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">if </span><span class="self">self </span>&lt; <span class="number">0 </span>{
<a href=#177 id=177 data-nosnippet>177</a> offset -= <span class="number">1</span>;
<a href=#178 id=178 data-nosnippet>178</a> buf[offset].write(<span class="string">b'-'</span>);
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a> <span class="comment">// SAFETY: Starting from `offset`, all elements of the slice have been set.
<a href=#181 id=181 data-nosnippet>181</a> </span><span class="kw">unsafe </span>{ slice_buffer_to_str(buf, offset) }
<a href=#182 id=182 data-nosnippet>182</a> }
<a href=#183 id=183 data-nosnippet>183</a> }
<a href=#184 id=184 data-nosnippet>184</a> };
<a href=#185 id=185 data-nosnippet>185</a>}
<a href=#186 id=186 data-nosnippet>186</a>
<a href=#187 id=187 data-nosnippet>187</a><span class="macro">impl_Integer!</span>(i8, u8);
<a href=#188 id=188 data-nosnippet>188</a><span class="macro">impl_Integer!</span>(i16, u16);
<a href=#189 id=189 data-nosnippet>189</a><span class="macro">impl_Integer!</span>(i32, u32);
<a href=#190 id=190 data-nosnippet>190</a><span class="macro">impl_Integer!</span>(i64, u64);
<a href=#191 id=191 data-nosnippet>191</a><span class="macro">impl_Integer!</span>(i128, u128);
<a href=#192 id=192 data-nosnippet>192</a>
<a href=#193 id=193 data-nosnippet>193</a><span class="macro">macro_rules!</span> impl_Integer_size {
<a href=#194 id=194 data-nosnippet>194</a> (<span class="macro-nonterminal">$t</span>:ty <span class="kw">as </span><span class="macro-nonterminal">$primitive</span>:ident <span class="attr">#[cfg(target_pointer_width = <span class="macro-nonterminal">$width</span>:literal)]</span>) =&gt; {
<a href=#195 id=195 data-nosnippet>195</a> <span class="attr">#[cfg(target_pointer_width = <span class="macro-nonterminal">$width</span>)]
<a href=#196 id=196 data-nosnippet>196</a> </span><span class="kw">impl </span>Integer <span class="kw">for </span><span class="macro-nonterminal">$t </span>{
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">const </span>MAX_STR_LEN: usize = &lt;<span class="macro-nonterminal">$primitive </span><span class="kw">as </span>Integer&gt;::MAX_STR_LEN;
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a>
<a href=#200 id=200 data-nosnippet>200</a> <span class="attr">#[cfg(target_pointer_width = <span class="macro-nonterminal">$width</span>)]
<a href=#201 id=201 data-nosnippet>201</a> </span><span class="kw">impl </span>private::Sealed <span class="kw">for </span><span class="macro-nonterminal">$t </span>{
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">type </span>Buffer = &lt;<span class="macro-nonterminal">$primitive </span><span class="kw">as </span>private::Sealed&gt;::Buffer;
<a href=#203 id=203 data-nosnippet>203</a>
<a href=#204 id=204 data-nosnippet>204</a> <span class="attr">#[inline]
<a href=#205 id=205 data-nosnippet>205</a> #[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#206 id=206 data-nosnippet>206</a> </span><span class="kw">fn </span>write(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#207 id=207 data-nosnippet>207</a> (<span class="self">self </span><span class="kw">as </span><span class="macro-nonterminal">$primitive</span>).write(buf)
<a href=#208 id=208 data-nosnippet>208</a> }
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a> };
<a href=#211 id=211 data-nosnippet>211</a>}
<a href=#212 id=212 data-nosnippet>212</a>
<a href=#213 id=213 data-nosnippet>213</a><span class="macro">impl_Integer_size!</span>(isize <span class="kw">as </span>i16 <span class="attr">#[cfg(target_pointer_width = <span class="string">"16"</span>)]</span>);
<a href=#214 id=214 data-nosnippet>214</a><span class="macro">impl_Integer_size!</span>(usize <span class="kw">as </span>u16 <span class="attr">#[cfg(target_pointer_width = <span class="string">"16"</span>)]</span>);
<a href=#215 id=215 data-nosnippet>215</a><span class="macro">impl_Integer_size!</span>(isize <span class="kw">as </span>i32 <span class="attr">#[cfg(target_pointer_width = <span class="string">"32"</span>)]</span>);
<a href=#216 id=216 data-nosnippet>216</a><span class="macro">impl_Integer_size!</span>(usize <span class="kw">as </span>u32 <span class="attr">#[cfg(target_pointer_width = <span class="string">"32"</span>)]</span>);
<a href=#217 id=217 data-nosnippet>217</a><span class="macro">impl_Integer_size!</span>(isize <span class="kw">as </span>i64 <span class="attr">#[cfg(target_pointer_width = <span class="string">"64"</span>)]</span>);
<a href=#218 id=218 data-nosnippet>218</a><span class="macro">impl_Integer_size!</span>(usize <span class="kw">as </span>u64 <span class="attr">#[cfg(target_pointer_width = <span class="string">"64"</span>)]</span>);
<a href=#219 id=219 data-nosnippet>219</a>
<a href=#220 id=220 data-nosnippet>220</a><span class="attr">#[repr(C, align(<span class="number">2</span>))]
<a href=#221 id=221 data-nosnippet>221</a></span><span class="kw">struct </span>DecimalPairs([u8; <span class="number">200</span>]);
<a href=#222 id=222 data-nosnippet>222</a>
<a href=#223 id=223 data-nosnippet>223</a><span class="comment">// The string of all two-digit numbers in range 00..99 is used as a lookup table.
<a href=#224 id=224 data-nosnippet>224</a></span><span class="kw">static </span>DECIMAL_PAIRS: DecimalPairs = DecimalPairs(
<a href=#225 id=225 data-nosnippet>225</a> <span class="kw-2">*</span><span class="string">b"0001020304050607080910111213141516171819\
<a href=#226 id=226 data-nosnippet>226</a> 2021222324252627282930313233343536373839\
<a href=#227 id=227 data-nosnippet>227</a> 4041424344454647484950515253545556575859\
<a href=#228 id=228 data-nosnippet>228</a> 6061626364656667686970717273747576777879\
<a href=#229 id=229 data-nosnippet>229</a> 8081828384858687888990919293949596979899"</span>,
<a href=#230 id=230 data-nosnippet>230</a>);
<a href=#231 id=231 data-nosnippet>231</a>
<a href=#232 id=232 data-nosnippet>232</a><span class="comment">// Returns {value / 100, value % 100} correct for values of up to 4 digits.
<a href=#233 id=233 data-nosnippet>233</a></span><span class="kw">fn </span>divmod100(value: u32) -&gt; (u32, u32) {
<a href=#234 id=234 data-nosnippet>234</a> <span class="macro">debug_assert!</span>(value &lt; <span class="number">10_000</span>);
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw">const </span>EXP: u32 = <span class="number">19</span>; <span class="comment">// 19 is faster or equal to 12 even for 3 digits.
<a href=#236 id=236 data-nosnippet>236</a> </span><span class="kw">const </span>SIG: u32 = (<span class="number">1 </span>&lt;&lt; EXP) / <span class="number">100 </span>+ <span class="number">1</span>;
<a href=#237 id=237 data-nosnippet>237</a> <span class="kw">let </span>div = (value * SIG) &gt;&gt; EXP; <span class="comment">// value / 100
<a href=#238 id=238 data-nosnippet>238</a> </span>(div, value - div * <span class="number">100</span>)
<a href=#239 id=239 data-nosnippet>239</a>}
<a href=#240 id=240 data-nosnippet>240</a>
<a href=#241 id=241 data-nosnippet>241</a><span class="doccomment">/// This function converts a slice of ascii characters into a `&amp;str` starting
<a href=#242 id=242 data-nosnippet>242</a>/// from `offset`.
<a href=#243 id=243 data-nosnippet>243</a>///
<a href=#244 id=244 data-nosnippet>244</a>/// # Safety
<a href=#245 id=245 data-nosnippet>245</a>///
<a href=#246 id=246 data-nosnippet>246</a>/// `buf` content starting from `offset` index MUST BE initialized and MUST BE
<a href=#247 id=247 data-nosnippet>247</a>/// ascii characters.
<a href=#248 id=248 data-nosnippet>248</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#249 id=249 data-nosnippet>249</a></span><span class="kw">unsafe fn </span>slice_buffer_to_str(buf: <span class="kw-2">&amp;</span>[MaybeUninit&lt;u8&gt;], offset: usize) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#250 id=250 data-nosnippet>250</a> <span class="comment">// SAFETY: `offset` is always included between 0 and `buf`'s length.
<a href=#251 id=251 data-nosnippet>251</a> </span><span class="kw">let </span>written = <span class="kw">unsafe </span>{ buf.get_unchecked(offset..) };
<a href=#252 id=252 data-nosnippet>252</a> <span class="comment">// SAFETY: (`assume_init_ref`) All buf content since offset is set.
<a href=#253 id=253 data-nosnippet>253</a> // SAFETY: (`from_utf8_unchecked`) Writes use ASCII from the lookup table exclusively.
<a href=#254 id=254 data-nosnippet>254</a> </span><span class="kw">unsafe </span>{ str::from_utf8_unchecked(<span class="kw-2">&amp;*</span>(written <span class="kw">as </span><span class="kw-2">*const </span>[MaybeUninit&lt;u8&gt;] <span class="kw">as </span><span class="kw-2">*const </span>[u8])) }
<a href=#255 id=255 data-nosnippet>255</a>}
<a href=#256 id=256 data-nosnippet>256</a>
<a href=#257 id=257 data-nosnippet>257</a><span class="kw">trait </span>Unsigned: Integer {
<a href=#258 id=258 data-nosnippet>258</a> <span class="kw">fn </span>fmt(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; usize;
<a href=#259 id=259 data-nosnippet>259</a>}
<a href=#260 id=260 data-nosnippet>260</a>
<a href=#261 id=261 data-nosnippet>261</a><span class="macro">macro_rules!</span> impl_Unsigned {
<a href=#262 id=262 data-nosnippet>262</a> (<span class="macro-nonterminal">$Unsigned</span>:ident) =&gt; {
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw">impl </span>Unsigned <span class="kw">for </span><span class="macro-nonterminal">$Unsigned </span>{
<a href=#264 id=264 data-nosnippet>264</a> <span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#265 id=265 data-nosnippet>265</a> </span><span class="kw">fn </span>fmt(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; usize {
<a href=#266 id=266 data-nosnippet>266</a> <span class="comment">// Count the number of bytes in buf that are not initialized.
<a href=#267 id=267 data-nosnippet>267</a> </span><span class="kw">let </span><span class="kw-2">mut </span>offset = buf.len();
<a href=#268 id=268 data-nosnippet>268</a> <span class="comment">// Consume the least-significant decimals from a working copy.
<a href=#269 id=269 data-nosnippet>269</a> </span><span class="kw">let </span><span class="kw-2">mut </span>remain = <span class="self">self</span>;
<a href=#270 id=270 data-nosnippet>270</a>
<a href=#271 id=271 data-nosnippet>271</a> <span class="comment">// Format per four digits from the lookup table.
<a href=#272 id=272 data-nosnippet>272</a> // Four digits need a 16-bit $Unsigned or wider.
<a href=#273 id=273 data-nosnippet>273</a> </span><span class="kw">while </span>mem::size_of::&lt;<span class="self">Self</span>&gt;() &gt; <span class="number">1
<a href=#274 id=274 data-nosnippet>274</a> </span>&amp;&amp; remain
<a href=#275 id=275 data-nosnippet>275</a> &gt; <span class="number">999
<a href=#276 id=276 data-nosnippet>276</a> </span>.try_into()
<a href=#277 id=277 data-nosnippet>277</a> .expect(<span class="string">"branch is not hit for types that cannot fit 999 (u8)"</span>)
<a href=#278 id=278 data-nosnippet>278</a> {
<a href=#279 id=279 data-nosnippet>279</a> offset -= <span class="number">4</span>;
<a href=#280 id=280 data-nosnippet>280</a>
<a href=#281 id=281 data-nosnippet>281</a> <span class="comment">// pull two pairs
<a href=#282 id=282 data-nosnippet>282</a> </span><span class="kw">let </span>scale: <span class="self">Self </span>= <span class="number">1_00_00
<a href=#283 id=283 data-nosnippet>283</a> </span>.try_into()
<a href=#284 id=284 data-nosnippet>284</a> .expect(<span class="string">"branch is not hit for types that cannot fit 1E4 (u8)"</span>);
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw">let </span>quad = remain % scale;
<a href=#286 id=286 data-nosnippet>286</a> remain /= scale;
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw">let </span>(pair1, pair2) = divmod100(quad <span class="kw">as </span>u32);
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">unsafe </span>{
<a href=#289 id=289 data-nosnippet>289</a> buf[offset + <span class="number">0</span>]
<a href=#290 id=290 data-nosnippet>290</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#291 id=291 data-nosnippet>291</a> buf[offset + <span class="number">1</span>]
<a href=#292 id=292 data-nosnippet>292</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#293 id=293 data-nosnippet>293</a> buf[offset + <span class="number">2</span>]
<a href=#294 id=294 data-nosnippet>294</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#295 id=295 data-nosnippet>295</a> buf[offset + <span class="number">3</span>]
<a href=#296 id=296 data-nosnippet>296</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#297 id=297 data-nosnippet>297</a> }
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a>
<a href=#300 id=300 data-nosnippet>300</a> <span class="comment">// Format per two digits from the lookup table.
<a href=#301 id=301 data-nosnippet>301</a> </span><span class="kw">if </span>remain &gt; <span class="number">9 </span>{
<a href=#302 id=302 data-nosnippet>302</a> offset -= <span class="number">2</span>;
<a href=#303 id=303 data-nosnippet>303</a>
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">let </span>(last, pair) = divmod100(remain <span class="kw">as </span>u32);
<a href=#305 id=305 data-nosnippet>305</a> remain = last <span class="kw">as </span><span class="self">Self</span>;
<a href=#306 id=306 data-nosnippet>306</a> <span class="kw">unsafe </span>{
<a href=#307 id=307 data-nosnippet>307</a> buf[offset + <span class="number">0</span>]
<a href=#308 id=308 data-nosnippet>308</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#309 id=309 data-nosnippet>309</a> buf[offset + <span class="number">1</span>]
<a href=#310 id=310 data-nosnippet>310</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#311 id=311 data-nosnippet>311</a> }
<a href=#312 id=312 data-nosnippet>312</a> }
<a href=#313 id=313 data-nosnippet>313</a>
<a href=#314 id=314 data-nosnippet>314</a> <span class="comment">// Format the last remaining digit, if any.
<a href=#315 id=315 data-nosnippet>315</a> </span><span class="kw">if </span><span class="macro">remain !</span>= <span class="number">0 </span>|| <span class="self">self </span>== <span class="number">0 </span>{
<a href=#316 id=316 data-nosnippet>316</a> offset -= <span class="number">1</span>;
<a href=#317 id=317 data-nosnippet>317</a>
<a href=#318 id=318 data-nosnippet>318</a> <span class="comment">// Either the compiler sees that remain &lt; 10, or it prevents
<a href=#319 id=319 data-nosnippet>319</a> // a boundary check up next.
<a href=#320 id=320 data-nosnippet>320</a> </span><span class="kw">let </span>last = remain <span class="kw">as </span>u8 &amp; <span class="number">15</span>;
<a href=#321 id=321 data-nosnippet>321</a> buf[offset].write(<span class="string">b'0' </span>+ last);
<a href=#322 id=322 data-nosnippet>322</a> <span class="comment">// not used: remain = 0;
<a href=#323 id=323 data-nosnippet>323</a> </span>}
<a href=#324 id=324 data-nosnippet>324</a>
<a href=#325 id=325 data-nosnippet>325</a> offset
<a href=#326 id=326 data-nosnippet>326</a> }
<a href=#327 id=327 data-nosnippet>327</a> }
<a href=#328 id=328 data-nosnippet>328</a> };
<a href=#329 id=329 data-nosnippet>329</a>}
<a href=#330 id=330 data-nosnippet>330</a>
<a href=#331 id=331 data-nosnippet>331</a><span class="macro">impl_Unsigned!</span>(u8);
<a href=#332 id=332 data-nosnippet>332</a><span class="macro">impl_Unsigned!</span>(u16);
<a href=#333 id=333 data-nosnippet>333</a><span class="macro">impl_Unsigned!</span>(u32);
<a href=#334 id=334 data-nosnippet>334</a><span class="macro">impl_Unsigned!</span>(u64);
<a href=#335 id=335 data-nosnippet>335</a>
<a href=#336 id=336 data-nosnippet>336</a><span class="kw">impl </span>Unsigned <span class="kw">for </span>u128 {
<a href=#337 id=337 data-nosnippet>337</a> <span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#338 id=338 data-nosnippet>338</a> </span><span class="kw">fn </span>fmt(<span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Buffer) -&gt; usize {
<a href=#339 id=339 data-nosnippet>339</a> <span class="comment">// Optimize common-case zero, which would also need special treatment due to
<a href=#340 id=340 data-nosnippet>340</a> // its "leading" zero.
<a href=#341 id=341 data-nosnippet>341</a> </span><span class="kw">if </span><span class="self">self </span>== <span class="number">0 </span>{
<a href=#342 id=342 data-nosnippet>342</a> <span class="kw">let </span>offset = buf.len() - <span class="number">1</span>;
<a href=#343 id=343 data-nosnippet>343</a> buf[offset].write(<span class="string">b'0'</span>);
<a href=#344 id=344 data-nosnippet>344</a> <span class="kw">return </span>offset;
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a> <span class="comment">// Take the 16 least-significant decimals.
<a href=#347 id=347 data-nosnippet>347</a> </span><span class="kw">let </span>(quot_1e16, mod_1e16) = div_rem_1e16(<span class="self">self</span>);
<a href=#348 id=348 data-nosnippet>348</a> <span class="kw">let </span>(<span class="kw-2">mut </span>remain, <span class="kw-2">mut </span>offset) = <span class="kw">if </span>quot_1e16 == <span class="number">0 </span>{
<a href=#349 id=349 data-nosnippet>349</a> (mod_1e16, u128::MAX_STR_LEN)
<a href=#350 id=350 data-nosnippet>350</a> } <span class="kw">else </span>{
<a href=#351 id=351 data-nosnippet>351</a> <span class="comment">// Write digits at buf[23..39].
<a href=#352 id=352 data-nosnippet>352</a> </span>enc_16lsd::&lt;{ u128::MAX_STR_LEN - <span class="number">16 </span>}&gt;(buf, mod_1e16);
<a href=#353 id=353 data-nosnippet>353</a>
<a href=#354 id=354 data-nosnippet>354</a> <span class="comment">// Take another 16 decimals.
<a href=#355 id=355 data-nosnippet>355</a> </span><span class="kw">let </span>(quot2, mod2) = div_rem_1e16(quot_1e16);
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw">if </span>quot2 == <span class="number">0 </span>{
<a href=#357 id=357 data-nosnippet>357</a> (mod2, u128::MAX_STR_LEN - <span class="number">16</span>)
<a href=#358 id=358 data-nosnippet>358</a> } <span class="kw">else </span>{
<a href=#359 id=359 data-nosnippet>359</a> <span class="comment">// Write digits at buf[7..23].
<a href=#360 id=360 data-nosnippet>360</a> </span>enc_16lsd::&lt;{ u128::MAX_STR_LEN - <span class="number">32 </span>}&gt;(buf, mod2);
<a href=#361 id=361 data-nosnippet>361</a> <span class="comment">// Quot2 has at most 7 decimals remaining after two 1e16 divisions.
<a href=#362 id=362 data-nosnippet>362</a> </span>(quot2 <span class="kw">as </span>u64, u128::MAX_STR_LEN - <span class="number">32</span>)
<a href=#363 id=363 data-nosnippet>363</a> }
<a href=#364 id=364 data-nosnippet>364</a> };
<a href=#365 id=365 data-nosnippet>365</a>
<a href=#366 id=366 data-nosnippet>366</a> <span class="comment">// Format per four digits from the lookup table.
<a href=#367 id=367 data-nosnippet>367</a> </span><span class="kw">while </span>remain &gt; <span class="number">999 </span>{
<a href=#368 id=368 data-nosnippet>368</a> offset -= <span class="number">4</span>;
<a href=#369 id=369 data-nosnippet>369</a>
<a href=#370 id=370 data-nosnippet>370</a> <span class="comment">// pull two pairs
<a href=#371 id=371 data-nosnippet>371</a> </span><span class="kw">let </span>quad = remain % <span class="number">1_00_00</span>;
<a href=#372 id=372 data-nosnippet>372</a> remain /= <span class="number">1_00_00</span>;
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">let </span>(pair1, pair2) = divmod100(quad <span class="kw">as </span>u32);
<a href=#374 id=374 data-nosnippet>374</a> <span class="kw">unsafe </span>{
<a href=#375 id=375 data-nosnippet>375</a> buf[offset + <span class="number">0</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#376 id=376 data-nosnippet>376</a> buf[offset + <span class="number">1</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#377 id=377 data-nosnippet>377</a> buf[offset + <span class="number">2</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#378 id=378 data-nosnippet>378</a> buf[offset + <span class="number">3</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#379 id=379 data-nosnippet>379</a> }
<a href=#380 id=380 data-nosnippet>380</a> }
<a href=#381 id=381 data-nosnippet>381</a>
<a href=#382 id=382 data-nosnippet>382</a> <span class="comment">// Format per two digits from the lookup table.
<a href=#383 id=383 data-nosnippet>383</a> </span><span class="kw">if </span>remain &gt; <span class="number">9 </span>{
<a href=#384 id=384 data-nosnippet>384</a> offset -= <span class="number">2</span>;
<a href=#385 id=385 data-nosnippet>385</a>
<a href=#386 id=386 data-nosnippet>386</a> <span class="kw">let </span>(last, pair) = divmod100(remain <span class="kw">as </span>u32);
<a href=#387 id=387 data-nosnippet>387</a> remain = last <span class="kw">as </span>u64;
<a href=#388 id=388 data-nosnippet>388</a> <span class="kw">unsafe </span>{
<a href=#389 id=389 data-nosnippet>389</a> buf[offset + <span class="number">0</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#390 id=390 data-nosnippet>390</a> buf[offset + <span class="number">1</span>].write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#391 id=391 data-nosnippet>391</a> }
<a href=#392 id=392 data-nosnippet>392</a> }
<a href=#393 id=393 data-nosnippet>393</a>
<a href=#394 id=394 data-nosnippet>394</a> <span class="comment">// Format the last remaining digit, if any.
<a href=#395 id=395 data-nosnippet>395</a> </span><span class="kw">if </span><span class="macro">remain !</span>= <span class="number">0 </span>{
<a href=#396 id=396 data-nosnippet>396</a> offset -= <span class="number">1</span>;
<a href=#397 id=397 data-nosnippet>397</a>
<a href=#398 id=398 data-nosnippet>398</a> <span class="comment">// Either the compiler sees that remain &lt; 10, or it prevents
<a href=#399 id=399 data-nosnippet>399</a> // a boundary check up next.
<a href=#400 id=400 data-nosnippet>400</a> </span><span class="kw">let </span>last = remain <span class="kw">as </span>u8 &amp; <span class="number">15</span>;
<a href=#401 id=401 data-nosnippet>401</a> buf[offset].write(<span class="string">b'0' </span>+ last);
<a href=#402 id=402 data-nosnippet>402</a> <span class="comment">// not used: remain = 0;
<a href=#403 id=403 data-nosnippet>403</a> </span>}
<a href=#404 id=404 data-nosnippet>404</a> offset
<a href=#405 id=405 data-nosnippet>405</a> }
<a href=#406 id=406 data-nosnippet>406</a>}
<a href=#407 id=407 data-nosnippet>407</a>
<a href=#408 id=408 data-nosnippet>408</a><span class="comment">// Encodes the 16 least-significant decimals of n into `buf[OFFSET..OFFSET + 16]`.
<a href=#409 id=409 data-nosnippet>409</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#410 id=410 data-nosnippet>410</a></span><span class="kw">fn </span>enc_16lsd&lt;<span class="kw">const </span>OFFSET: usize&gt;(buf: <span class="kw-2">&amp;mut </span>[MaybeUninit&lt;u8&gt;], n: u64) {
<a href=#411 id=411 data-nosnippet>411</a> <span class="comment">// Consume the least-significant decimals from a working copy.
<a href=#412 id=412 data-nosnippet>412</a> </span><span class="kw">let </span><span class="kw-2">mut </span>remain = n;
<a href=#413 id=413 data-nosnippet>413</a>
<a href=#414 id=414 data-nosnippet>414</a> <span class="comment">// Format per four digits from the lookup table.
<a href=#415 id=415 data-nosnippet>415</a> </span><span class="kw">for </span>quad_index <span class="kw">in </span>(<span class="number">0</span>..<span class="number">4</span>).rev() {
<a href=#416 id=416 data-nosnippet>416</a> <span class="comment">// pull two pairs
<a href=#417 id=417 data-nosnippet>417</a> </span><span class="kw">let </span>quad = remain % <span class="number">1_00_00</span>;
<a href=#418 id=418 data-nosnippet>418</a> remain /= <span class="number">1_00_00</span>;
<a href=#419 id=419 data-nosnippet>419</a> <span class="kw">let </span>(pair1, pair2) = divmod100(quad <span class="kw">as </span>u32);
<a href=#420 id=420 data-nosnippet>420</a> <span class="kw">unsafe </span>{
<a href=#421 id=421 data-nosnippet>421</a> buf[quad_index * <span class="number">4 </span>+ OFFSET + <span class="number">0</span>]
<a href=#422 id=422 data-nosnippet>422</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#423 id=423 data-nosnippet>423</a> buf[quad_index * <span class="number">4 </span>+ OFFSET + <span class="number">1</span>]
<a href=#424 id=424 data-nosnippet>424</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair1 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#425 id=425 data-nosnippet>425</a> buf[quad_index * <span class="number">4 </span>+ OFFSET + <span class="number">2</span>]
<a href=#426 id=426 data-nosnippet>426</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">0</span>));
<a href=#427 id=427 data-nosnippet>427</a> buf[quad_index * <span class="number">4 </span>+ OFFSET + <span class="number">3</span>]
<a href=#428 id=428 data-nosnippet>428</a> .write(<span class="kw-2">*</span>DECIMAL_PAIRS.<span class="number">0</span>.get_unchecked(pair2 <span class="kw">as </span>usize * <span class="number">2 </span>+ <span class="number">1</span>));
<a href=#429 id=429 data-nosnippet>429</a> }
<a href=#430 id=430 data-nosnippet>430</a> }
<a href=#431 id=431 data-nosnippet>431</a>}
<a href=#432 id=432 data-nosnippet>432</a>
<a href=#433 id=433 data-nosnippet>433</a><span class="comment">// Euclidean division plus remainder with constant 1E16 basically consumes 16
<a href=#434 id=434 data-nosnippet>434</a>// decimals from n.
<a href=#435 id=435 data-nosnippet>435</a>//
<a href=#436 id=436 data-nosnippet>436</a>// The integer division algorithm is based on the following paper:
<a href=#437 id=437 data-nosnippet>437</a>//
<a href=#438 id=438 data-nosnippet>438</a>// T. Granlund and P. Montgomery, “Division by Invariant Integers Using Multiplication”
<a href=#439 id=439 data-nosnippet>439</a>// in Proc. of the SIGPLAN94 Conference on Programming Language Design and
<a href=#440 id=440 data-nosnippet>440</a>// Implementation, 1994, pp. 6172
<a href=#441 id=441 data-nosnippet>441</a>//
<a href=#442 id=442 data-nosnippet>442</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"no-panic"</span>, no_panic)]
<a href=#443 id=443 data-nosnippet>443</a></span><span class="kw">fn </span>div_rem_1e16(n: u128) -&gt; (u128, u64) {
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw">const </span>D: u128 = <span class="number">1_0000_0000_0000_0000</span>;
<a href=#445 id=445 data-nosnippet>445</a> <span class="comment">// The check inlines well with the caller flow.
<a href=#446 id=446 data-nosnippet>446</a> </span><span class="kw">if </span>n &lt; D {
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">return </span>(<span class="number">0</span>, n <span class="kw">as </span>u64);
<a href=#448 id=448 data-nosnippet>448</a> }
<a href=#449 id=449 data-nosnippet>449</a>
<a href=#450 id=450 data-nosnippet>450</a> <span class="comment">// These constant values are computed with the CHOOSE_MULTIPLIER procedure
<a href=#451 id=451 data-nosnippet>451</a> // from the Granlund &amp; Montgomery paper, using N=128, prec=128 and d=1E16.
<a href=#452 id=452 data-nosnippet>452</a> </span><span class="kw">const </span>M_HIGH: u128 = <span class="number">76624777043294442917917351357515459181</span>;
<a href=#453 id=453 data-nosnippet>453</a> <span class="kw">const </span>SH_POST: u8 = <span class="number">51</span>;
<a href=#454 id=454 data-nosnippet>454</a>
<a href=#455 id=455 data-nosnippet>455</a> <span class="comment">// n.widening_mul(M_HIGH).1 &gt;&gt; SH_POST
<a href=#456 id=456 data-nosnippet>456</a> </span><span class="kw">let </span>quot = u128_ext::mulhi(n, M_HIGH) &gt;&gt; SH_POST;
<a href=#457 id=457 data-nosnippet>457</a> <span class="kw">let </span>rem = n - quot * D;
<a href=#458 id=458 data-nosnippet>458</a> (quot, rem <span class="kw">as </span>u64)
<a href=#459 id=459 data-nosnippet>459</a>}
</code></pre></div></section></main></body></html>