Files
GopherGate/target/doc/src/arrayvec/array_string.rs.html
2026-02-26 12:00:21 -05:00

717 lines
72 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/arrayvec-0.7.6/src/array_string.rs`."><title>array_string.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="arrayvec" 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">arrayvec/</div>array_string.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="kw">use </span>std::borrow::{Borrow, BorrowMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>std::cmp;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span>std::convert::TryFrom;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>std::fmt;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>std::hash::{Hash, Hasher};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>std::mem::MaybeUninit;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span>std::ops::{Deref, DerefMut};
<a href=#8 id=8 data-nosnippet>8</a><span class="attr">#[cfg(feature=<span class="string">"std"</span>)]
<a href=#9 id=9 data-nosnippet>9</a></span><span class="kw">use </span>std::path::Path;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span>std::ptr;
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span>std::slice;
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span>std::str;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span>std::str::FromStr;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">use </span>std::str::Utf8Error;
<a href=#15 id=15 data-nosnippet>15</a>
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">use </span><span class="kw">crate</span>::CapacityError;
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">use </span><span class="kw">crate</span>::LenUint;
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">use </span><span class="kw">crate</span>::char::encode_utf8;
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">use </span><span class="kw">crate</span>::utils::MakeMaybeUninit;
<a href=#20 id=20 data-nosnippet>20</a>
<a href=#21 id=21 data-nosnippet>21</a><span class="attr">#[cfg(feature=<span class="string">"serde"</span>)]
<a href=#22 id=22 data-nosnippet>22</a></span><span class="kw">use </span>serde::{Serialize, Deserialize, Serializer, Deserializer};
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a><span class="doccomment">/// A string with a fixed capacity.
<a href=#26 id=26 data-nosnippet>26</a>///
<a href=#27 id=27 data-nosnippet>27</a>/// The `ArrayString` is a string backed by a fixed size array. It keeps track
<a href=#28 id=28 data-nosnippet>28</a>/// of its length, and is parameterized by `CAP` for the maximum capacity.
<a href=#29 id=29 data-nosnippet>29</a>///
<a href=#30 id=30 data-nosnippet>30</a>/// `CAP` is of type `usize` but is range limited to `u32::MAX`; attempting to create larger
<a href=#31 id=31 data-nosnippet>31</a>/// arrayvecs with larger capacity will panic.
<a href=#32 id=32 data-nosnippet>32</a>///
<a href=#33 id=33 data-nosnippet>33</a>/// The string is a contiguous value that you can store directly on the stack
<a href=#34 id=34 data-nosnippet>34</a>/// if needed.
<a href=#35 id=35 data-nosnippet>35</a></span><span class="attr">#[derive(Copy)]
<a href=#36 id=36 data-nosnippet>36</a>#[repr(C)]
<a href=#37 id=37 data-nosnippet>37</a></span><span class="kw">pub struct </span>ArrayString&lt;<span class="kw">const </span>CAP: usize&gt; {
<a href=#38 id=38 data-nosnippet>38</a> <span class="comment">// the `len` first elements of the array are initialized
<a href=#39 id=39 data-nosnippet>39</a> </span>len: LenUint,
<a href=#40 id=40 data-nosnippet>40</a> xs: [MaybeUninit&lt;u8&gt;; CAP],
<a href=#41 id=41 data-nosnippet>41</a>}
<a href=#42 id=42 data-nosnippet>42</a>
<a href=#43 id=43 data-nosnippet>43</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Default <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#44 id=44 data-nosnippet>44</a>{
<a href=#45 id=45 data-nosnippet>45</a> <span class="doccomment">/// Return an empty `ArrayString`
<a href=#46 id=46 data-nosnippet>46</a> </span><span class="kw">fn </span>default() -&gt; ArrayString&lt;CAP&gt; {
<a href=#47 id=47 data-nosnippet>47</a> ArrayString::new()
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>}
<a href=#50 id=50 data-nosnippet>50</a>
<a href=#51 id=51 data-nosnippet>51</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; ArrayString&lt;CAP&gt;
<a href=#52 id=52 data-nosnippet>52</a>{
<a href=#53 id=53 data-nosnippet>53</a> <span class="doccomment">/// Create a new empty `ArrayString`.
<a href=#54 id=54 data-nosnippet>54</a> ///
<a href=#55 id=55 data-nosnippet>55</a> /// Capacity is inferred from the type parameter.
<a href=#56 id=56 data-nosnippet>56</a> ///
<a href=#57 id=57 data-nosnippet>57</a> /// ```
<a href=#58 id=58 data-nosnippet>58</a> /// use arrayvec::ArrayString;
<a href=#59 id=59 data-nosnippet>59</a> ///
<a href=#60 id=60 data-nosnippet>60</a> /// let mut string = ArrayString::&lt;16&gt;::new();
<a href=#61 id=61 data-nosnippet>61</a> /// string.push_str("foo");
<a href=#62 id=62 data-nosnippet>62</a> /// assert_eq!(&amp;string[..], "foo");
<a href=#63 id=63 data-nosnippet>63</a> /// assert_eq!(string.capacity(), 16);
<a href=#64 id=64 data-nosnippet>64</a> /// ```
<a href=#65 id=65 data-nosnippet>65</a> </span><span class="kw">pub fn </span>new() -&gt; ArrayString&lt;CAP&gt; {
<a href=#66 id=66 data-nosnippet>66</a> <span class="macro">assert_capacity_limit!</span>(CAP);
<a href=#67 id=67 data-nosnippet>67</a> <span class="kw">unsafe </span>{
<a href=#68 id=68 data-nosnippet>68</a> ArrayString { xs: MaybeUninit::uninit().assume_init(), len: <span class="number">0 </span>}
<a href=#69 id=69 data-nosnippet>69</a> }
<a href=#70 id=70 data-nosnippet>70</a> }
<a href=#71 id=71 data-nosnippet>71</a>
<a href=#72 id=72 data-nosnippet>72</a> <span class="doccomment">/// Create a new empty `ArrayString` (const fn).
<a href=#73 id=73 data-nosnippet>73</a> ///
<a href=#74 id=74 data-nosnippet>74</a> /// Capacity is inferred from the type parameter.
<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> /// use arrayvec::ArrayString;
<a href=#78 id=78 data-nosnippet>78</a> ///
<a href=#79 id=79 data-nosnippet>79</a> /// static ARRAY: ArrayString&lt;1024&gt; = ArrayString::new_const();
<a href=#80 id=80 data-nosnippet>80</a> /// ```
<a href=#81 id=81 data-nosnippet>81</a> </span><span class="kw">pub const fn </span>new_const() -&gt; ArrayString&lt;CAP&gt; {
<a href=#82 id=82 data-nosnippet>82</a> <span class="macro">assert_capacity_limit_const!</span>(CAP);
<a href=#83 id=83 data-nosnippet>83</a> ArrayString { xs: MakeMaybeUninit::ARRAY, len: <span class="number">0 </span>}
<a href=#84 id=84 data-nosnippet>84</a> }
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a> <span class="doccomment">/// Return the length of the string.
<a href=#87 id=87 data-nosnippet>87</a> </span><span class="attr">#[inline]
<a href=#88 id=88 data-nosnippet>88</a> </span><span class="kw">pub const fn </span>len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize { <span class="self">self</span>.len <span class="kw">as </span>usize }
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="doccomment">/// Returns whether the string is empty.
<a href=#91 id=91 data-nosnippet>91</a> </span><span class="attr">#[inline]
<a href=#92 id=92 data-nosnippet>92</a> </span><span class="kw">pub const fn </span>is_empty(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool { <span class="self">self</span>.len() == <span class="number">0 </span>}
<a href=#93 id=93 data-nosnippet>93</a>
<a href=#94 id=94 data-nosnippet>94</a> <span class="doccomment">/// Create a new `ArrayString` from a `str`.
<a href=#95 id=95 data-nosnippet>95</a> ///
<a href=#96 id=96 data-nosnippet>96</a> /// Capacity is inferred from the type parameter.
<a href=#97 id=97 data-nosnippet>97</a> ///
<a href=#98 id=98 data-nosnippet>98</a> /// **Errors** if the backing array is not large enough to fit the string.
<a href=#99 id=99 data-nosnippet>99</a> ///
<a href=#100 id=100 data-nosnippet>100</a> /// ```
<a href=#101 id=101 data-nosnippet>101</a> /// use arrayvec::ArrayString;
<a href=#102 id=102 data-nosnippet>102</a> ///
<a href=#103 id=103 data-nosnippet>103</a> /// let mut string = ArrayString::&lt;3&gt;::from("foo").unwrap();
<a href=#104 id=104 data-nosnippet>104</a> /// assert_eq!(&amp;string[..], "foo");
<a href=#105 id=105 data-nosnippet>105</a> /// assert_eq!(string.len(), 3);
<a href=#106 id=106 data-nosnippet>106</a> /// assert_eq!(string.capacity(), 3);
<a href=#107 id=107 data-nosnippet>107</a> /// ```
<a href=#108 id=108 data-nosnippet>108</a> </span><span class="kw">pub fn </span>from(s: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, CapacityError&lt;<span class="kw-2">&amp;</span>str&gt;&gt; {
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">let </span><span class="kw-2">mut </span>arraystr = <span class="self">Self</span>::new();
<a href=#110 id=110 data-nosnippet>110</a> arraystr.try_push_str(s)<span class="question-mark">?</span>;
<a href=#111 id=111 data-nosnippet>111</a> <span class="prelude-val">Ok</span>(arraystr)
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a>
<a href=#114 id=114 data-nosnippet>114</a> <span class="doccomment">/// Create a new `ArrayString` from a byte string literal.
<a href=#115 id=115 data-nosnippet>115</a> ///
<a href=#116 id=116 data-nosnippet>116</a> /// **Errors** if the byte string literal is not valid UTF-8.
<a href=#117 id=117 data-nosnippet>117</a> ///
<a href=#118 id=118 data-nosnippet>118</a> /// ```
<a href=#119 id=119 data-nosnippet>119</a> /// use arrayvec::ArrayString;
<a href=#120 id=120 data-nosnippet>120</a> ///
<a href=#121 id=121 data-nosnippet>121</a> /// let string = ArrayString::from_byte_string(b"hello world").unwrap();
<a href=#122 id=122 data-nosnippet>122</a> /// ```
<a href=#123 id=123 data-nosnippet>123</a> </span><span class="kw">pub fn </span>from_byte_string(b: <span class="kw-2">&amp;</span>[u8; CAP]) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, Utf8Error&gt; {
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">let </span>len = str::from_utf8(b)<span class="question-mark">?</span>.len();
<a href=#125 id=125 data-nosnippet>125</a> <span class="macro">debug_assert_eq!</span>(len, CAP);
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">let </span><span class="kw-2">mut </span>vec = <span class="self">Self</span>::new();
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">unsafe </span>{
<a href=#128 id=128 data-nosnippet>128</a> (b <span class="kw">as </span><span class="kw-2">*const </span>[u8; CAP] <span class="kw">as </span><span class="kw-2">*const </span>[MaybeUninit&lt;u8&gt;; CAP])
<a href=#129 id=129 data-nosnippet>129</a> .copy_to_nonoverlapping(<span class="kw-2">&amp;mut </span>vec.xs <span class="kw">as </span><span class="kw-2">*mut </span>[MaybeUninit&lt;u8&gt;; CAP], <span class="number">1</span>);
<a href=#130 id=130 data-nosnippet>130</a> vec.set_len(CAP);
<a href=#131 id=131 data-nosnippet>131</a> }
<a href=#132 id=132 data-nosnippet>132</a> <span class="prelude-val">Ok</span>(vec)
<a href=#133 id=133 data-nosnippet>133</a> }
<a href=#134 id=134 data-nosnippet>134</a>
<a href=#135 id=135 data-nosnippet>135</a> <span class="doccomment">/// Create a new `ArrayString` value fully filled with ASCII NULL characters (`\0`). Useful
<a href=#136 id=136 data-nosnippet>136</a> /// to be used as a buffer to collect external data or as a buffer for intermediate processing.
<a href=#137 id=137 data-nosnippet>137</a> ///
<a href=#138 id=138 data-nosnippet>138</a> /// ```
<a href=#139 id=139 data-nosnippet>139</a> /// use arrayvec::ArrayString;
<a href=#140 id=140 data-nosnippet>140</a> ///
<a href=#141 id=141 data-nosnippet>141</a> /// let string = ArrayString::&lt;16&gt;::zero_filled();
<a href=#142 id=142 data-nosnippet>142</a> /// assert_eq!(string.len(), 16);
<a href=#143 id=143 data-nosnippet>143</a> /// ```
<a href=#144 id=144 data-nosnippet>144</a> </span><span class="attr">#[inline]
<a href=#145 id=145 data-nosnippet>145</a> </span><span class="kw">pub fn </span>zero_filled() -&gt; <span class="self">Self </span>{
<a href=#146 id=146 data-nosnippet>146</a> <span class="macro">assert_capacity_limit!</span>(CAP);
<a href=#147 id=147 data-nosnippet>147</a> <span class="comment">// SAFETY: `assert_capacity_limit` asserts that `len` won't overflow and
<a href=#148 id=148 data-nosnippet>148</a> // `zeroed` fully fills the array with nulls.
<a href=#149 id=149 data-nosnippet>149</a> </span><span class="kw">unsafe </span>{
<a href=#150 id=150 data-nosnippet>150</a> ArrayString {
<a href=#151 id=151 data-nosnippet>151</a> xs: MaybeUninit::zeroed().assume_init(),
<a href=#152 id=152 data-nosnippet>152</a> len: CAP <span class="kw">as _
<a href=#153 id=153 data-nosnippet>153</a> </span>}
<a href=#154 id=154 data-nosnippet>154</a> }
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a>
<a href=#157 id=157 data-nosnippet>157</a> <span class="doccomment">/// Return the capacity of the `ArrayString`.
<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> /// use arrayvec::ArrayString;
<a href=#161 id=161 data-nosnippet>161</a> ///
<a href=#162 id=162 data-nosnippet>162</a> /// let string = ArrayString::&lt;3&gt;::new();
<a href=#163 id=163 data-nosnippet>163</a> /// assert_eq!(string.capacity(), 3);
<a href=#164 id=164 data-nosnippet>164</a> /// ```
<a href=#165 id=165 data-nosnippet>165</a> </span><span class="attr">#[inline(always)]
<a href=#166 id=166 data-nosnippet>166</a> </span><span class="kw">pub const fn </span>capacity(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize { CAP }
<a href=#167 id=167 data-nosnippet>167</a>
<a href=#168 id=168 data-nosnippet>168</a> <span class="doccomment">/// Return if the `ArrayString` is completely filled.
<a href=#169 id=169 data-nosnippet>169</a> ///
<a href=#170 id=170 data-nosnippet>170</a> /// ```
<a href=#171 id=171 data-nosnippet>171</a> /// use arrayvec::ArrayString;
<a href=#172 id=172 data-nosnippet>172</a> ///
<a href=#173 id=173 data-nosnippet>173</a> /// let mut string = ArrayString::&lt;1&gt;::new();
<a href=#174 id=174 data-nosnippet>174</a> /// assert!(!string.is_full());
<a href=#175 id=175 data-nosnippet>175</a> /// string.push_str("A");
<a href=#176 id=176 data-nosnippet>176</a> /// assert!(string.is_full());
<a href=#177 id=177 data-nosnippet>177</a> /// ```
<a href=#178 id=178 data-nosnippet>178</a> </span><span class="kw">pub const fn </span>is_full(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool { <span class="self">self</span>.len() == <span class="self">self</span>.capacity() }
<a href=#179 id=179 data-nosnippet>179</a>
<a href=#180 id=180 data-nosnippet>180</a> <span class="doccomment">/// Returns the capacity left in the `ArrayString`.
<a href=#181 id=181 data-nosnippet>181</a> ///
<a href=#182 id=182 data-nosnippet>182</a> /// ```
<a href=#183 id=183 data-nosnippet>183</a> /// use arrayvec::ArrayString;
<a href=#184 id=184 data-nosnippet>184</a> ///
<a href=#185 id=185 data-nosnippet>185</a> /// let mut string = ArrayString::&lt;3&gt;::from("abc").unwrap();
<a href=#186 id=186 data-nosnippet>186</a> /// string.pop();
<a href=#187 id=187 data-nosnippet>187</a> /// assert_eq!(string.remaining_capacity(), 1);
<a href=#188 id=188 data-nosnippet>188</a> /// ```
<a href=#189 id=189 data-nosnippet>189</a> </span><span class="kw">pub const fn </span>remaining_capacity(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#190 id=190 data-nosnippet>190</a> <span class="self">self</span>.capacity() - <span class="self">self</span>.len()
<a href=#191 id=191 data-nosnippet>191</a> }
<a href=#192 id=192 data-nosnippet>192</a>
<a href=#193 id=193 data-nosnippet>193</a> <span class="doccomment">/// Adds the given char to the end of the string.
<a href=#194 id=194 data-nosnippet>194</a> ///
<a href=#195 id=195 data-nosnippet>195</a> /// ***Panics*** if the backing array is not large enough to fit the additional char.
<a href=#196 id=196 data-nosnippet>196</a> ///
<a href=#197 id=197 data-nosnippet>197</a> /// ```
<a href=#198 id=198 data-nosnippet>198</a> /// use arrayvec::ArrayString;
<a href=#199 id=199 data-nosnippet>199</a> ///
<a href=#200 id=200 data-nosnippet>200</a> /// let mut string = ArrayString::&lt;2&gt;::new();
<a href=#201 id=201 data-nosnippet>201</a> ///
<a href=#202 id=202 data-nosnippet>202</a> /// string.push('a');
<a href=#203 id=203 data-nosnippet>203</a> /// string.push('b');
<a href=#204 id=204 data-nosnippet>204</a> ///
<a href=#205 id=205 data-nosnippet>205</a> /// assert_eq!(&amp;string[..], "ab");
<a href=#206 id=206 data-nosnippet>206</a> /// ```
<a href=#207 id=207 data-nosnippet>207</a> </span><span class="attr">#[track_caller]
<a href=#208 id=208 data-nosnippet>208</a> </span><span class="kw">pub fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, c: char) {
<a href=#209 id=209 data-nosnippet>209</a> <span class="self">self</span>.try_push(c).unwrap();
<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> <span class="doccomment">/// Adds the given char to the end of the string.
<a href=#213 id=213 data-nosnippet>213</a> ///
<a href=#214 id=214 data-nosnippet>214</a> /// Returns `Ok` if the push succeeds.
<a href=#215 id=215 data-nosnippet>215</a> ///
<a href=#216 id=216 data-nosnippet>216</a> /// **Errors** if the backing array is not large enough to fit the additional char.
<a href=#217 id=217 data-nosnippet>217</a> ///
<a href=#218 id=218 data-nosnippet>218</a> /// ```
<a href=#219 id=219 data-nosnippet>219</a> /// use arrayvec::ArrayString;
<a href=#220 id=220 data-nosnippet>220</a> ///
<a href=#221 id=221 data-nosnippet>221</a> /// let mut string = ArrayString::&lt;2&gt;::new();
<a href=#222 id=222 data-nosnippet>222</a> ///
<a href=#223 id=223 data-nosnippet>223</a> /// string.try_push('a').unwrap();
<a href=#224 id=224 data-nosnippet>224</a> /// string.try_push('b').unwrap();
<a href=#225 id=225 data-nosnippet>225</a> /// let overflow = string.try_push('c');
<a href=#226 id=226 data-nosnippet>226</a> ///
<a href=#227 id=227 data-nosnippet>227</a> /// assert_eq!(&amp;string[..], "ab");
<a href=#228 id=228 data-nosnippet>228</a> /// assert_eq!(overflow.unwrap_err().element(), 'c');
<a href=#229 id=229 data-nosnippet>229</a> /// ```
<a href=#230 id=230 data-nosnippet>230</a> </span><span class="kw">pub fn </span>try_push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, c: char) -&gt; <span class="prelude-ty">Result</span>&lt;(), CapacityError&lt;char&gt;&gt; {
<a href=#231 id=231 data-nosnippet>231</a> <span class="kw">let </span>len = <span class="self">self</span>.len();
<a href=#232 id=232 data-nosnippet>232</a> <span class="kw">unsafe </span>{
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">let </span>ptr = <span class="self">self</span>.as_mut_ptr().add(len);
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">let </span>remaining_cap = <span class="self">self</span>.capacity() - len;
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw">match </span>encode_utf8(c, ptr, remaining_cap) {
<a href=#236 id=236 data-nosnippet>236</a> <span class="prelude-val">Ok</span>(n) =&gt; {
<a href=#237 id=237 data-nosnippet>237</a> <span class="self">self</span>.set_len(len + n);
<a href=#238 id=238 data-nosnippet>238</a> <span class="prelude-val">Ok</span>(())
<a href=#239 id=239 data-nosnippet>239</a> }
<a href=#240 id=240 data-nosnippet>240</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(CapacityError::new(c)),
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> }
<a href=#243 id=243 data-nosnippet>243</a> }
<a href=#244 id=244 data-nosnippet>244</a>
<a href=#245 id=245 data-nosnippet>245</a> <span class="doccomment">/// Adds the given string slice to the end of the string.
<a href=#246 id=246 data-nosnippet>246</a> ///
<a href=#247 id=247 data-nosnippet>247</a> /// ***Panics*** if the backing array is not large enough to fit the string.
<a href=#248 id=248 data-nosnippet>248</a> ///
<a href=#249 id=249 data-nosnippet>249</a> /// ```
<a href=#250 id=250 data-nosnippet>250</a> /// use arrayvec::ArrayString;
<a href=#251 id=251 data-nosnippet>251</a> ///
<a href=#252 id=252 data-nosnippet>252</a> /// let mut string = ArrayString::&lt;2&gt;::new();
<a href=#253 id=253 data-nosnippet>253</a> ///
<a href=#254 id=254 data-nosnippet>254</a> /// string.push_str("a");
<a href=#255 id=255 data-nosnippet>255</a> /// string.push_str("d");
<a href=#256 id=256 data-nosnippet>256</a> ///
<a href=#257 id=257 data-nosnippet>257</a> /// assert_eq!(&amp;string[..], "ad");
<a href=#258 id=258 data-nosnippet>258</a> /// ```
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="attr">#[track_caller]
<a href=#260 id=260 data-nosnippet>260</a> </span><span class="kw">pub fn </span>push_str(<span class="kw-2">&amp;mut </span><span class="self">self</span>, s: <span class="kw-2">&amp;</span>str) {
<a href=#261 id=261 data-nosnippet>261</a> <span class="self">self</span>.try_push_str(s).unwrap()
<a href=#262 id=262 data-nosnippet>262</a> }
<a href=#263 id=263 data-nosnippet>263</a>
<a href=#264 id=264 data-nosnippet>264</a> <span class="doccomment">/// Adds the given string slice to the end of the string.
<a href=#265 id=265 data-nosnippet>265</a> ///
<a href=#266 id=266 data-nosnippet>266</a> /// Returns `Ok` if the push succeeds.
<a href=#267 id=267 data-nosnippet>267</a> ///
<a href=#268 id=268 data-nosnippet>268</a> /// **Errors** if the backing array is not large enough to fit the string.
<a href=#269 id=269 data-nosnippet>269</a> ///
<a href=#270 id=270 data-nosnippet>270</a> /// ```
<a href=#271 id=271 data-nosnippet>271</a> /// use arrayvec::ArrayString;
<a href=#272 id=272 data-nosnippet>272</a> ///
<a href=#273 id=273 data-nosnippet>273</a> /// let mut string = ArrayString::&lt;2&gt;::new();
<a href=#274 id=274 data-nosnippet>274</a> ///
<a href=#275 id=275 data-nosnippet>275</a> /// string.try_push_str("a").unwrap();
<a href=#276 id=276 data-nosnippet>276</a> /// let overflow1 = string.try_push_str("bc");
<a href=#277 id=277 data-nosnippet>277</a> /// string.try_push_str("d").unwrap();
<a href=#278 id=278 data-nosnippet>278</a> /// let overflow2 = string.try_push_str("ef");
<a href=#279 id=279 data-nosnippet>279</a> ///
<a href=#280 id=280 data-nosnippet>280</a> /// assert_eq!(&amp;string[..], "ad");
<a href=#281 id=281 data-nosnippet>281</a> /// assert_eq!(overflow1.unwrap_err().element(), "bc");
<a href=#282 id=282 data-nosnippet>282</a> /// assert_eq!(overflow2.unwrap_err().element(), "ef");
<a href=#283 id=283 data-nosnippet>283</a> /// ```
<a href=#284 id=284 data-nosnippet>284</a> </span><span class="kw">pub fn </span>try_push_str&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, s: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str) -&gt; <span class="prelude-ty">Result</span>&lt;(), CapacityError&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>str&gt;&gt; {
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw">if </span>s.len() &gt; <span class="self">self</span>.capacity() - <span class="self">self</span>.len() {
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw">return </span><span class="prelude-val">Err</span>(CapacityError::new(s));
<a href=#287 id=287 data-nosnippet>287</a> }
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">unsafe </span>{
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw">let </span>dst = <span class="self">self</span>.as_mut_ptr().add(<span class="self">self</span>.len());
<a href=#290 id=290 data-nosnippet>290</a> <span class="kw">let </span>src = s.as_ptr();
<a href=#291 id=291 data-nosnippet>291</a> ptr::copy_nonoverlapping(src, dst, s.len());
<a href=#292 id=292 data-nosnippet>292</a> <span class="kw">let </span>newl = <span class="self">self</span>.len() + s.len();
<a href=#293 id=293 data-nosnippet>293</a> <span class="self">self</span>.set_len(newl);
<a href=#294 id=294 data-nosnippet>294</a> }
<a href=#295 id=295 data-nosnippet>295</a> <span class="prelude-val">Ok</span>(())
<a href=#296 id=296 data-nosnippet>296</a> }
<a href=#297 id=297 data-nosnippet>297</a>
<a href=#298 id=298 data-nosnippet>298</a> <span class="doccomment">/// Removes the last character from the string and returns it.
<a href=#299 id=299 data-nosnippet>299</a> ///
<a href=#300 id=300 data-nosnippet>300</a> /// Returns `None` if this `ArrayString` is empty.
<a href=#301 id=301 data-nosnippet>301</a> ///
<a href=#302 id=302 data-nosnippet>302</a> /// ```
<a href=#303 id=303 data-nosnippet>303</a> /// use arrayvec::ArrayString;
<a href=#304 id=304 data-nosnippet>304</a> ///
<a href=#305 id=305 data-nosnippet>305</a> /// let mut s = ArrayString::&lt;3&gt;::from("foo").unwrap();
<a href=#306 id=306 data-nosnippet>306</a> ///
<a href=#307 id=307 data-nosnippet>307</a> /// assert_eq!(s.pop(), Some('o'));
<a href=#308 id=308 data-nosnippet>308</a> /// assert_eq!(s.pop(), Some('o'));
<a href=#309 id=309 data-nosnippet>309</a> /// assert_eq!(s.pop(), Some('f'));
<a href=#310 id=310 data-nosnippet>310</a> ///
<a href=#311 id=311 data-nosnippet>311</a> /// assert_eq!(s.pop(), None);
<a href=#312 id=312 data-nosnippet>312</a> /// ```
<a href=#313 id=313 data-nosnippet>313</a> </span><span class="kw">pub fn </span>pop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;char&gt; {
<a href=#314 id=314 data-nosnippet>314</a> <span class="kw">let </span>ch = <span class="kw">match </span><span class="self">self</span>.chars().rev().next() {
<a href=#315 id=315 data-nosnippet>315</a> <span class="prelude-val">Some</span>(ch) =&gt; ch,
<a href=#316 id=316 data-nosnippet>316</a> <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">None</span>,
<a href=#317 id=317 data-nosnippet>317</a> };
<a href=#318 id=318 data-nosnippet>318</a> <span class="kw">let </span>new_len = <span class="self">self</span>.len() - ch.len_utf8();
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">unsafe </span>{
<a href=#320 id=320 data-nosnippet>320</a> <span class="self">self</span>.set_len(new_len);
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a> <span class="prelude-val">Some</span>(ch)
<a href=#323 id=323 data-nosnippet>323</a> }
<a href=#324 id=324 data-nosnippet>324</a>
<a href=#325 id=325 data-nosnippet>325</a> <span class="doccomment">/// Shortens this `ArrayString` to the specified length.
<a href=#326 id=326 data-nosnippet>326</a> ///
<a href=#327 id=327 data-nosnippet>327</a> /// If `new_len` is greater than the strings current length, this has no
<a href=#328 id=328 data-nosnippet>328</a> /// effect.
<a href=#329 id=329 data-nosnippet>329</a> ///
<a href=#330 id=330 data-nosnippet>330</a> /// ***Panics*** if `new_len` does not lie on a `char` boundary.
<a href=#331 id=331 data-nosnippet>331</a> ///
<a href=#332 id=332 data-nosnippet>332</a> /// ```
<a href=#333 id=333 data-nosnippet>333</a> /// use arrayvec::ArrayString;
<a href=#334 id=334 data-nosnippet>334</a> ///
<a href=#335 id=335 data-nosnippet>335</a> /// let mut string = ArrayString::&lt;6&gt;::from("foobar").unwrap();
<a href=#336 id=336 data-nosnippet>336</a> /// string.truncate(3);
<a href=#337 id=337 data-nosnippet>337</a> /// assert_eq!(&amp;string[..], "foo");
<a href=#338 id=338 data-nosnippet>338</a> /// string.truncate(4);
<a href=#339 id=339 data-nosnippet>339</a> /// assert_eq!(&amp;string[..], "foo");
<a href=#340 id=340 data-nosnippet>340</a> /// ```
<a href=#341 id=341 data-nosnippet>341</a> </span><span class="kw">pub fn </span>truncate(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_len: usize) {
<a href=#342 id=342 data-nosnippet>342</a> <span class="kw">if </span>new_len &lt;= <span class="self">self</span>.len() {
<a href=#343 id=343 data-nosnippet>343</a> <span class="macro">assert!</span>(<span class="self">self</span>.is_char_boundary(new_len));
<a href=#344 id=344 data-nosnippet>344</a> <span class="kw">unsafe </span>{
<a href=#345 id=345 data-nosnippet>345</a> <span class="comment">// In libstd truncate is called on the underlying vector,
<a href=#346 id=346 data-nosnippet>346</a> // which in turns drops each element.
<a href=#347 id=347 data-nosnippet>347</a> // As we know we don't have to worry about Drop,
<a href=#348 id=348 data-nosnippet>348</a> // we can just set the length (a la clear.)
<a href=#349 id=349 data-nosnippet>349</a> </span><span class="self">self</span>.set_len(new_len);
<a href=#350 id=350 data-nosnippet>350</a> }
<a href=#351 id=351 data-nosnippet>351</a> }
<a href=#352 id=352 data-nosnippet>352</a> }
<a href=#353 id=353 data-nosnippet>353</a>
<a href=#354 id=354 data-nosnippet>354</a> <span class="doccomment">/// Removes a `char` from this `ArrayString` at a byte position and returns it.
<a href=#355 id=355 data-nosnippet>355</a> ///
<a href=#356 id=356 data-nosnippet>356</a> /// This is an `O(n)` operation, as it requires copying every element in the
<a href=#357 id=357 data-nosnippet>357</a> /// array.
<a href=#358 id=358 data-nosnippet>358</a> ///
<a href=#359 id=359 data-nosnippet>359</a> /// ***Panics*** if `idx` is larger than or equal to the `ArrayString`s length,
<a href=#360 id=360 data-nosnippet>360</a> /// or if it does not lie on a `char` boundary.
<a href=#361 id=361 data-nosnippet>361</a> ///
<a href=#362 id=362 data-nosnippet>362</a> /// ```
<a href=#363 id=363 data-nosnippet>363</a> /// use arrayvec::ArrayString;
<a href=#364 id=364 data-nosnippet>364</a> ///
<a href=#365 id=365 data-nosnippet>365</a> /// let mut s = ArrayString::&lt;3&gt;::from("foo").unwrap();
<a href=#366 id=366 data-nosnippet>366</a> ///
<a href=#367 id=367 data-nosnippet>367</a> /// assert_eq!(s.remove(0), 'f');
<a href=#368 id=368 data-nosnippet>368</a> /// assert_eq!(s.remove(1), 'o');
<a href=#369 id=369 data-nosnippet>369</a> /// assert_eq!(s.remove(0), 'o');
<a href=#370 id=370 data-nosnippet>370</a> /// ```
<a href=#371 id=371 data-nosnippet>371</a> </span><span class="kw">pub fn </span>remove(<span class="kw-2">&amp;mut </span><span class="self">self</span>, idx: usize) -&gt; char {
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw">let </span>ch = <span class="kw">match </span><span class="self">self</span>[idx..].chars().next() {
<a href=#373 id=373 data-nosnippet>373</a> <span class="prelude-val">Some</span>(ch) =&gt; ch,
<a href=#374 id=374 data-nosnippet>374</a> <span class="prelude-val">None </span>=&gt; <span class="macro">panic!</span>(<span class="string">"cannot remove a char from the end of a string"</span>),
<a href=#375 id=375 data-nosnippet>375</a> };
<a href=#376 id=376 data-nosnippet>376</a>
<a href=#377 id=377 data-nosnippet>377</a> <span class="kw">let </span>next = idx + ch.len_utf8();
<a href=#378 id=378 data-nosnippet>378</a> <span class="kw">let </span>len = <span class="self">self</span>.len();
<a href=#379 id=379 data-nosnippet>379</a> <span class="kw">let </span>ptr = <span class="self">self</span>.as_mut_ptr();
<a href=#380 id=380 data-nosnippet>380</a> <span class="kw">unsafe </span>{
<a href=#381 id=381 data-nosnippet>381</a> ptr::copy(
<a href=#382 id=382 data-nosnippet>382</a> ptr.add(next),
<a href=#383 id=383 data-nosnippet>383</a> ptr.add(idx),
<a href=#384 id=384 data-nosnippet>384</a> len - next);
<a href=#385 id=385 data-nosnippet>385</a> <span class="self">self</span>.set_len(len - (next - idx));
<a href=#386 id=386 data-nosnippet>386</a> }
<a href=#387 id=387 data-nosnippet>387</a> ch
<a href=#388 id=388 data-nosnippet>388</a> }
<a href=#389 id=389 data-nosnippet>389</a>
<a href=#390 id=390 data-nosnippet>390</a> <span class="doccomment">/// Make the string empty.
<a href=#391 id=391 data-nosnippet>391</a> </span><span class="kw">pub fn </span>clear(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#392 id=392 data-nosnippet>392</a> <span class="kw">unsafe </span>{
<a href=#393 id=393 data-nosnippet>393</a> <span class="self">self</span>.set_len(<span class="number">0</span>);
<a href=#394 id=394 data-nosnippet>394</a> }
<a href=#395 id=395 data-nosnippet>395</a> }
<a href=#396 id=396 data-nosnippet>396</a>
<a href=#397 id=397 data-nosnippet>397</a> <span class="doccomment">/// Set the stringss length.
<a href=#398 id=398 data-nosnippet>398</a> ///
<a href=#399 id=399 data-nosnippet>399</a> /// This function is `unsafe` because it changes the notion of the
<a href=#400 id=400 data-nosnippet>400</a> /// number of “valid” bytes in the string. Use with care.
<a href=#401 id=401 data-nosnippet>401</a> ///
<a href=#402 id=402 data-nosnippet>402</a> /// This method uses *debug assertions* to check the validity of `length`
<a href=#403 id=403 data-nosnippet>403</a> /// and may use other debug assertions.
<a href=#404 id=404 data-nosnippet>404</a> </span><span class="kw">pub unsafe fn </span>set_len(<span class="kw-2">&amp;mut </span><span class="self">self</span>, length: usize) {
<a href=#405 id=405 data-nosnippet>405</a> <span class="comment">// type invariant that capacity always fits in LenUint
<a href=#406 id=406 data-nosnippet>406</a> </span><span class="macro">debug_assert!</span>(length &lt;= <span class="self">self</span>.capacity());
<a href=#407 id=407 data-nosnippet>407</a> <span class="self">self</span>.len = length <span class="kw">as </span>LenUint;
<a href=#408 id=408 data-nosnippet>408</a> }
<a href=#409 id=409 data-nosnippet>409</a>
<a href=#410 id=410 data-nosnippet>410</a> <span class="doccomment">/// Return a string slice of the whole `ArrayString`.
<a href=#411 id=411 data-nosnippet>411</a> </span><span class="kw">pub fn </span>as_str(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#412 id=412 data-nosnippet>412</a> <span class="self">self
<a href=#413 id=413 data-nosnippet>413</a> </span>}
<a href=#414 id=414 data-nosnippet>414</a>
<a href=#415 id=415 data-nosnippet>415</a> <span class="doccomment">/// Return a mutable string slice of the whole `ArrayString`.
<a href=#416 id=416 data-nosnippet>416</a> </span><span class="kw">pub fn </span>as_mut_str(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>str {
<a href=#417 id=417 data-nosnippet>417</a> <span class="self">self
<a href=#418 id=418 data-nosnippet>418</a> </span>}
<a href=#419 id=419 data-nosnippet>419</a>
<a href=#420 id=420 data-nosnippet>420</a> <span class="doccomment">/// Return a raw pointer to the string's buffer.
<a href=#421 id=421 data-nosnippet>421</a> </span><span class="kw">pub fn </span>as_ptr(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">*const </span>u8 {
<a href=#422 id=422 data-nosnippet>422</a> <span class="self">self</span>.xs.as_ptr() <span class="kw">as </span><span class="kw-2">*const </span>u8
<a href=#423 id=423 data-nosnippet>423</a> }
<a href=#424 id=424 data-nosnippet>424</a>
<a href=#425 id=425 data-nosnippet>425</a> <span class="doccomment">/// Return a raw mutable pointer to the string's buffer.
<a href=#426 id=426 data-nosnippet>426</a> </span><span class="kw">pub fn </span>as_mut_ptr(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">*mut </span>u8 {
<a href=#427 id=427 data-nosnippet>427</a> <span class="self">self</span>.xs.as_mut_ptr() <span class="kw">as </span><span class="kw-2">*mut </span>u8
<a href=#428 id=428 data-nosnippet>428</a> }
<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><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Deref <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#432 id=432 data-nosnippet>432</a>{
<a href=#433 id=433 data-nosnippet>433</a> <span class="kw">type </span>Target = str;
<a href=#434 id=434 data-nosnippet>434</a> <span class="attr">#[inline]
<a href=#435 id=435 data-nosnippet>435</a> </span><span class="kw">fn </span>deref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>str {
<a href=#436 id=436 data-nosnippet>436</a> <span class="kw">unsafe </span>{
<a href=#437 id=437 data-nosnippet>437</a> <span class="kw">let </span>sl = slice::from_raw_parts(<span class="self">self</span>.as_ptr(), <span class="self">self</span>.len());
<a href=#438 id=438 data-nosnippet>438</a> str::from_utf8_unchecked(sl)
<a href=#439 id=439 data-nosnippet>439</a> }
<a href=#440 id=440 data-nosnippet>440</a> }
<a href=#441 id=441 data-nosnippet>441</a>}
<a href=#442 id=442 data-nosnippet>442</a>
<a href=#443 id=443 data-nosnippet>443</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; DerefMut <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#444 id=444 data-nosnippet>444</a>{
<a href=#445 id=445 data-nosnippet>445</a> <span class="attr">#[inline]
<a href=#446 id=446 data-nosnippet>446</a> </span><span class="kw">fn </span>deref_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>str {
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">unsafe </span>{
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">let </span>len = <span class="self">self</span>.len();
<a href=#449 id=449 data-nosnippet>449</a> <span class="kw">let </span>sl = slice::from_raw_parts_mut(<span class="self">self</span>.as_mut_ptr(), len);
<a href=#450 id=450 data-nosnippet>450</a> str::from_utf8_unchecked_mut(sl)
<a href=#451 id=451 data-nosnippet>451</a> }
<a href=#452 id=452 data-nosnippet>452</a> }
<a href=#453 id=453 data-nosnippet>453</a>}
<a href=#454 id=454 data-nosnippet>454</a>
<a href=#455 id=455 data-nosnippet>455</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialEq <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#456 id=456 data-nosnippet>456</a>{
<a href=#457 id=457 data-nosnippet>457</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
<a href=#458 id=458 data-nosnippet>458</a> <span class="kw-2">**</span><span class="self">self </span>== <span class="kw-2">**</span>rhs
<a href=#459 id=459 data-nosnippet>459</a> }
<a href=#460 id=460 data-nosnippet>460</a>}
<a href=#461 id=461 data-nosnippet>461</a>
<a href=#462 id=462 data-nosnippet>462</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialEq&lt;str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#463 id=463 data-nosnippet>463</a>{
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; bool {
<a href=#465 id=465 data-nosnippet>465</a> <span class="kw-2">&amp;**</span><span class="self">self </span>== rhs
<a href=#466 id=466 data-nosnippet>466</a> }
<a href=#467 id=467 data-nosnippet>467</a>}
<a href=#468 id=468 data-nosnippet>468</a>
<a href=#469 id=469 data-nosnippet>469</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialEq&lt;ArrayString&lt;CAP&gt;&gt; <span class="kw">for </span>str
<a href=#470 id=470 data-nosnippet>470</a>{
<a href=#471 id=471 data-nosnippet>471</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; bool {
<a href=#472 id=472 data-nosnippet>472</a> <span class="self">self </span>== <span class="kw-2">&amp;**</span>rhs
<a href=#473 id=473 data-nosnippet>473</a> }
<a href=#474 id=474 data-nosnippet>474</a>}
<a href=#475 id=475 data-nosnippet>475</a>
<a href=#476 id=476 data-nosnippet>476</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Eq <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#477 id=477 data-nosnippet>477</a>{ }
<a href=#478 id=478 data-nosnippet>478</a>
<a href=#479 id=479 data-nosnippet>479</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Hash <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#480 id=480 data-nosnippet>480</a>{
<a href=#481 id=481 data-nosnippet>481</a> <span class="kw">fn </span>hash&lt;H: Hasher&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, h: <span class="kw-2">&amp;mut </span>H) {
<a href=#482 id=482 data-nosnippet>482</a> (<span class="kw-2">**</span><span class="self">self</span>).hash(h)
<a href=#483 id=483 data-nosnippet>483</a> }
<a href=#484 id=484 data-nosnippet>484</a>}
<a href=#485 id=485 data-nosnippet>485</a>
<a href=#486 id=486 data-nosnippet>486</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Borrow&lt;str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#487 id=487 data-nosnippet>487</a>{
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw">fn </span>borrow(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>str { <span class="self">self </span>}
<a href=#489 id=489 data-nosnippet>489</a>}
<a href=#490 id=490 data-nosnippet>490</a>
<a href=#491 id=491 data-nosnippet>491</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; BorrowMut&lt;str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#492 id=492 data-nosnippet>492</a>{
<a href=#493 id=493 data-nosnippet>493</a> <span class="kw">fn </span>borrow_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>str { <span class="self">self </span>}
<a href=#494 id=494 data-nosnippet>494</a>}
<a href=#495 id=495 data-nosnippet>495</a>
<a href=#496 id=496 data-nosnippet>496</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; AsRef&lt;str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#497 id=497 data-nosnippet>497</a>{
<a href=#498 id=498 data-nosnippet>498</a> <span class="kw">fn </span>as_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>str { <span class="self">self </span>}
<a href=#499 id=499 data-nosnippet>499</a>}
<a href=#500 id=500 data-nosnippet>500</a>
<a href=#501 id=501 data-nosnippet>501</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; fmt::Debug <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#502 id=502 data-nosnippet>502</a>{
<a href=#503 id=503 data-nosnippet>503</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result { (<span class="kw-2">**</span><span class="self">self</span>).fmt(f) }
<a href=#504 id=504 data-nosnippet>504</a>}
<a href=#505 id=505 data-nosnippet>505</a>
<a href=#506 id=506 data-nosnippet>506</a><span class="attr">#[cfg(feature=<span class="string">"std"</span>)]
<a href=#507 id=507 data-nosnippet>507</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; AsRef&lt;Path&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt; {
<a href=#508 id=508 data-nosnippet>508</a> <span class="kw">fn </span>as_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>Path {
<a href=#509 id=509 data-nosnippet>509</a> <span class="self">self</span>.as_str().as_ref()
<a href=#510 id=510 data-nosnippet>510</a> }
<a href=#511 id=511 data-nosnippet>511</a>}
<a href=#512 id=512 data-nosnippet>512</a>
<a href=#513 id=513 data-nosnippet>513</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; fmt::Display <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#514 id=514 data-nosnippet>514</a>{
<a href=#515 id=515 data-nosnippet>515</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result { (<span class="kw-2">**</span><span class="self">self</span>).fmt(f) }
<a href=#516 id=516 data-nosnippet>516</a>}
<a href=#517 id=517 data-nosnippet>517</a>
<a href=#518 id=518 data-nosnippet>518</a><span class="doccomment">/// `Write` appends written data to the end of the string.
<a href=#519 id=519 data-nosnippet>519</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; fmt::Write <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#520 id=520 data-nosnippet>520</a>{
<a href=#521 id=521 data-nosnippet>521</a> <span class="kw">fn </span>write_char(<span class="kw-2">&amp;mut </span><span class="self">self</span>, c: char) -&gt; fmt::Result {
<a href=#522 id=522 data-nosnippet>522</a> <span class="self">self</span>.try_push(c).map_err(|<span class="kw">_</span>| fmt::Error)
<a href=#523 id=523 data-nosnippet>523</a> }
<a href=#524 id=524 data-nosnippet>524</a>
<a href=#525 id=525 data-nosnippet>525</a> <span class="kw">fn </span>write_str(<span class="kw-2">&amp;mut </span><span class="self">self</span>, s: <span class="kw-2">&amp;</span>str) -&gt; fmt::Result {
<a href=#526 id=526 data-nosnippet>526</a> <span class="self">self</span>.try_push_str(s).map_err(|<span class="kw">_</span>| fmt::Error)
<a href=#527 id=527 data-nosnippet>527</a> }
<a href=#528 id=528 data-nosnippet>528</a>}
<a href=#529 id=529 data-nosnippet>529</a>
<a href=#530 id=530 data-nosnippet>530</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Clone <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#531 id=531 data-nosnippet>531</a>{
<a href=#532 id=532 data-nosnippet>532</a> <span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; ArrayString&lt;CAP&gt; {
<a href=#533 id=533 data-nosnippet>533</a> <span class="kw-2">*</span><span class="self">self
<a href=#534 id=534 data-nosnippet>534</a> </span>}
<a href=#535 id=535 data-nosnippet>535</a> <span class="kw">fn </span>clone_from(<span class="kw-2">&amp;mut </span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) {
<a href=#536 id=536 data-nosnippet>536</a> <span class="comment">// guaranteed to fit due to types matching.
<a href=#537 id=537 data-nosnippet>537</a> </span><span class="self">self</span>.clear();
<a href=#538 id=538 data-nosnippet>538</a> <span class="self">self</span>.try_push_str(rhs).ok();
<a href=#539 id=539 data-nosnippet>539</a> }
<a href=#540 id=540 data-nosnippet>540</a>}
<a href=#541 id=541 data-nosnippet>541</a>
<a href=#542 id=542 data-nosnippet>542</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialOrd <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#543 id=543 data-nosnippet>543</a>{
<a href=#544 id=544 data-nosnippet>544</a> <span class="kw">fn </span>partial_cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;cmp::Ordering&gt; {
<a href=#545 id=545 data-nosnippet>545</a> (<span class="kw-2">**</span><span class="self">self</span>).partial_cmp(<span class="kw-2">&amp;**</span>rhs)
<a href=#546 id=546 data-nosnippet>546</a> }
<a href=#547 id=547 data-nosnippet>547</a> <span class="kw">fn </span>lt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool { <span class="kw-2">**</span><span class="self">self </span>&lt; <span class="kw-2">**</span>rhs }
<a href=#548 id=548 data-nosnippet>548</a> <span class="kw">fn </span>le(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool { <span class="kw-2">**</span><span class="self">self </span>&lt;= <span class="kw-2">**</span>rhs }
<a href=#549 id=549 data-nosnippet>549</a> <span class="kw">fn </span>gt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool { <span class="kw-2">**</span><span class="self">self </span>&gt; <span class="kw-2">**</span>rhs }
<a href=#550 id=550 data-nosnippet>550</a> <span class="kw">fn </span>ge(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool { <span class="kw-2">**</span><span class="self">self </span>&gt;= <span class="kw-2">**</span>rhs }
<a href=#551 id=551 data-nosnippet>551</a>}
<a href=#552 id=552 data-nosnippet>552</a>
<a href=#553 id=553 data-nosnippet>553</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialOrd&lt;str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#554 id=554 data-nosnippet>554</a>{
<a href=#555 id=555 data-nosnippet>555</a> <span class="kw">fn </span>partial_cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Option</span>&lt;cmp::Ordering&gt; {
<a href=#556 id=556 data-nosnippet>556</a> (<span class="kw-2">**</span><span class="self">self</span>).partial_cmp(rhs)
<a href=#557 id=557 data-nosnippet>557</a> }
<a href=#558 id=558 data-nosnippet>558</a> <span class="kw">fn </span>lt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; bool { <span class="kw-2">&amp;**</span><span class="self">self </span>&lt; rhs }
<a href=#559 id=559 data-nosnippet>559</a> <span class="kw">fn </span>le(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; bool { <span class="kw-2">&amp;**</span><span class="self">self </span>&lt;= rhs }
<a href=#560 id=560 data-nosnippet>560</a> <span class="kw">fn </span>gt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; bool { <span class="kw-2">&amp;**</span><span class="self">self </span>&gt; rhs }
<a href=#561 id=561 data-nosnippet>561</a> <span class="kw">fn </span>ge(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>str) -&gt; bool { <span class="kw-2">&amp;**</span><span class="self">self </span>&gt;= rhs }
<a href=#562 id=562 data-nosnippet>562</a>}
<a href=#563 id=563 data-nosnippet>563</a>
<a href=#564 id=564 data-nosnippet>564</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; PartialOrd&lt;ArrayString&lt;CAP&gt;&gt; <span class="kw">for </span>str
<a href=#565 id=565 data-nosnippet>565</a>{
<a href=#566 id=566 data-nosnippet>566</a> <span class="kw">fn </span>partial_cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; <span class="prelude-ty">Option</span>&lt;cmp::Ordering&gt; {
<a href=#567 id=567 data-nosnippet>567</a> <span class="self">self</span>.partial_cmp(<span class="kw-2">&amp;**</span>rhs)
<a href=#568 id=568 data-nosnippet>568</a> }
<a href=#569 id=569 data-nosnippet>569</a> <span class="kw">fn </span>lt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; bool { <span class="self">self </span>&lt; <span class="kw-2">&amp;**</span>rhs }
<a href=#570 id=570 data-nosnippet>570</a> <span class="kw">fn </span>le(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; bool { <span class="self">self </span>&lt;= <span class="kw-2">&amp;**</span>rhs }
<a href=#571 id=571 data-nosnippet>571</a> <span class="kw">fn </span>gt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; bool { <span class="self">self </span>&gt; <span class="kw-2">&amp;**</span>rhs }
<a href=#572 id=572 data-nosnippet>572</a> <span class="kw">fn </span>ge(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span>ArrayString&lt;CAP&gt;) -&gt; bool { <span class="self">self </span>&gt;= <span class="kw-2">&amp;**</span>rhs }
<a href=#573 id=573 data-nosnippet>573</a>}
<a href=#574 id=574 data-nosnippet>574</a>
<a href=#575 id=575 data-nosnippet>575</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Ord <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#576 id=576 data-nosnippet>576</a>{
<a href=#577 id=577 data-nosnippet>577</a> <span class="kw">fn </span>cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; cmp::Ordering {
<a href=#578 id=578 data-nosnippet>578</a> (<span class="kw-2">**</span><span class="self">self</span>).cmp(<span class="kw-2">&amp;**</span>rhs)
<a href=#579 id=579 data-nosnippet>579</a> }
<a href=#580 id=580 data-nosnippet>580</a>}
<a href=#581 id=581 data-nosnippet>581</a>
<a href=#582 id=582 data-nosnippet>582</a><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; FromStr <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#583 id=583 data-nosnippet>583</a>{
<a href=#584 id=584 data-nosnippet>584</a> <span class="kw">type </span><span class="prelude-val">Err </span>= CapacityError;
<a href=#585 id=585 data-nosnippet>585</a>
<a href=#586 id=586 data-nosnippet>586</a> <span class="kw">fn </span>from_str(s: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, <span class="self">Self</span>::Err&gt; {
<a href=#587 id=587 data-nosnippet>587</a> <span class="self">Self</span>::from(s).map_err(CapacityError::simplify)
<a href=#588 id=588 data-nosnippet>588</a> }
<a href=#589 id=589 data-nosnippet>589</a>}
<a href=#590 id=590 data-nosnippet>590</a>
<a href=#591 id=591 data-nosnippet>591</a><span class="attr">#[cfg(feature=<span class="string">"serde"</span>)]
<a href=#592 id=592 data-nosnippet>592</a></span><span class="doccomment">/// Requires crate feature `"serde"`
<a href=#593 id=593 data-nosnippet>593</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; Serialize <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#594 id=594 data-nosnippet>594</a>{
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; <span class="prelude-ty">Result</span>&lt;S::Ok, S::Error&gt;
<a href=#596 id=596 data-nosnippet>596</a> <span class="kw">where </span>S: Serializer
<a href=#597 id=597 data-nosnippet>597</a> {
<a href=#598 id=598 data-nosnippet>598</a> serializer.serialize_str(<span class="kw-2">&amp;*</span><span class="self">self</span>)
<a href=#599 id=599 data-nosnippet>599</a> }
<a href=#600 id=600 data-nosnippet>600</a>}
<a href=#601 id=601 data-nosnippet>601</a>
<a href=#602 id=602 data-nosnippet>602</a><span class="attr">#[cfg(feature=<span class="string">"serde"</span>)]
<a href=#603 id=603 data-nosnippet>603</a></span><span class="doccomment">/// Requires crate feature `"serde"`
<a href=#604 id=604 data-nosnippet>604</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>, <span class="kw">const </span>CAP: usize&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#605 id=605 data-nosnippet>605</a>{
<a href=#606 id=606 data-nosnippet>606</a> <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, D::Error&gt;
<a href=#607 id=607 data-nosnippet>607</a> <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt;
<a href=#608 id=608 data-nosnippet>608</a> {
<a href=#609 id=609 data-nosnippet>609</a> <span class="kw">use </span>serde::de::{<span class="self">self</span>, Visitor};
<a href=#610 id=610 data-nosnippet>610</a> <span class="kw">use </span>std::marker::PhantomData;
<a href=#611 id=611 data-nosnippet>611</a>
<a href=#612 id=612 data-nosnippet>612</a> <span class="kw">struct </span>ArrayStringVisitor&lt;<span class="kw">const </span>CAP: usize&gt;(PhantomData&lt;[u8; CAP]&gt;);
<a href=#613 id=613 data-nosnippet>613</a>
<a href=#614 id=614 data-nosnippet>614</a> <span class="kw">impl</span>&lt;<span class="lifetime">'de</span>, <span class="kw">const </span>CAP: usize&gt; Visitor&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>ArrayStringVisitor&lt;CAP&gt; {
<a href=#615 id=615 data-nosnippet>615</a> <span class="kw">type </span>Value = ArrayString&lt;CAP&gt;;
<a href=#616 id=616 data-nosnippet>616</a>
<a href=#617 id=617 data-nosnippet>617</a> <span class="kw">fn </span>expecting(<span class="kw-2">&amp;</span><span class="self">self</span>, formatter: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
<a href=#618 id=618 data-nosnippet>618</a> <span class="macro">write!</span>(formatter, <span class="string">"a string no more than {} bytes long"</span>, CAP)
<a href=#619 id=619 data-nosnippet>619</a> }
<a href=#620 id=620 data-nosnippet>620</a>
<a href=#621 id=621 data-nosnippet>621</a> <span class="kw">fn </span>visit_str&lt;E&gt;(<span class="self">self</span>, v: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>::Value, E&gt;
<a href=#622 id=622 data-nosnippet>622</a> <span class="kw">where </span>E: de::Error,
<a href=#623 id=623 data-nosnippet>623</a> {
<a href=#624 id=624 data-nosnippet>624</a> ArrayString::from(v).map_err(|<span class="kw">_</span>| E::invalid_length(v.len(), <span class="kw-2">&amp;</span><span class="self">self</span>))
<a href=#625 id=625 data-nosnippet>625</a> }
<a href=#626 id=626 data-nosnippet>626</a>
<a href=#627 id=627 data-nosnippet>627</a> <span class="kw">fn </span>visit_bytes&lt;E&gt;(<span class="self">self</span>, v: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>::Value, E&gt;
<a href=#628 id=628 data-nosnippet>628</a> <span class="kw">where </span>E: de::Error,
<a href=#629 id=629 data-nosnippet>629</a> {
<a href=#630 id=630 data-nosnippet>630</a> <span class="kw">let </span>s = str::from_utf8(v).map_err(|<span class="kw">_</span>| E::invalid_value(de::Unexpected::Bytes(v), <span class="kw-2">&amp;</span><span class="self">self</span>))<span class="question-mark">?</span>;
<a href=#631 id=631 data-nosnippet>631</a>
<a href=#632 id=632 data-nosnippet>632</a> ArrayString::from(s).map_err(|<span class="kw">_</span>| E::invalid_length(s.len(), <span class="kw-2">&amp;</span><span class="self">self</span>))
<a href=#633 id=633 data-nosnippet>633</a> }
<a href=#634 id=634 data-nosnippet>634</a> }
<a href=#635 id=635 data-nosnippet>635</a>
<a href=#636 id=636 data-nosnippet>636</a> deserializer.deserialize_str(ArrayStringVisitor(PhantomData))
<a href=#637 id=637 data-nosnippet>637</a> }
<a href=#638 id=638 data-nosnippet>638</a>}
<a href=#639 id=639 data-nosnippet>639</a>
<a href=#640 id=640 data-nosnippet>640</a><span class="attr">#[cfg(feature = <span class="string">"borsh"</span>)]
<a href=#641 id=641 data-nosnippet>641</a></span><span class="doccomment">/// Requires crate feature `"borsh"`
<a href=#642 id=642 data-nosnippet>642</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; borsh::BorshSerialize <span class="kw">for </span>ArrayString&lt;CAP&gt; {
<a href=#643 id=643 data-nosnippet>643</a> <span class="kw">fn </span>serialize&lt;W: borsh::io::Write&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, writer: <span class="kw-2">&amp;mut </span>W) -&gt; borsh::io::Result&lt;()&gt; {
<a href=#644 id=644 data-nosnippet>644</a> &lt;str <span class="kw">as </span>borsh::BorshSerialize&gt;::serialize(<span class="kw-2">&amp;*</span><span class="self">self</span>, writer)
<a href=#645 id=645 data-nosnippet>645</a> }
<a href=#646 id=646 data-nosnippet>646</a>}
<a href=#647 id=647 data-nosnippet>647</a>
<a href=#648 id=648 data-nosnippet>648</a><span class="attr">#[cfg(feature = <span class="string">"borsh"</span>)]
<a href=#649 id=649 data-nosnippet>649</a></span><span class="doccomment">/// Requires crate feature `"borsh"`
<a href=#650 id=650 data-nosnippet>650</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; borsh::BorshDeserialize <span class="kw">for </span>ArrayString&lt;CAP&gt; {
<a href=#651 id=651 data-nosnippet>651</a> <span class="kw">fn </span>deserialize_reader&lt;R: borsh::io::Read&gt;(reader: <span class="kw-2">&amp;mut </span>R) -&gt; borsh::io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#652 id=652 data-nosnippet>652</a> <span class="kw">let </span>len = &lt;u32 <span class="kw">as </span>borsh::BorshDeserialize&gt;::deserialize_reader(reader)<span class="question-mark">? </span><span class="kw">as </span>usize;
<a href=#653 id=653 data-nosnippet>653</a> <span class="kw">if </span>len &gt; CAP {
<a href=#654 id=654 data-nosnippet>654</a> <span class="kw">return </span><span class="prelude-val">Err</span>(borsh::io::Error::new(
<a href=#655 id=655 data-nosnippet>655</a> borsh::io::ErrorKind::InvalidData,
<a href=#656 id=656 data-nosnippet>656</a> <span class="macro">format!</span>(<span class="string">"Expected a string no more than {} bytes long"</span>, CAP),
<a href=#657 id=657 data-nosnippet>657</a> ))
<a href=#658 id=658 data-nosnippet>658</a> }
<a href=#659 id=659 data-nosnippet>659</a>
<a href=#660 id=660 data-nosnippet>660</a> <span class="kw">let </span><span class="kw-2">mut </span>buf = [<span class="number">0u8</span>; CAP];
<a href=#661 id=661 data-nosnippet>661</a> <span class="kw">let </span>buf = <span class="kw-2">&amp;mut </span>buf[..len];
<a href=#662 id=662 data-nosnippet>662</a> reader.read_exact(buf)<span class="question-mark">?</span>;
<a href=#663 id=663 data-nosnippet>663</a>
<a href=#664 id=664 data-nosnippet>664</a> <span class="kw">let </span>s = str::from_utf8(<span class="kw-2">&amp;</span>buf).map_err(|err| {
<a href=#665 id=665 data-nosnippet>665</a> borsh::io::Error::new(borsh::io::ErrorKind::InvalidData, err.to_string())
<a href=#666 id=666 data-nosnippet>666</a> })<span class="question-mark">?</span>;
<a href=#667 id=667 data-nosnippet>667</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::from(s).unwrap())
<a href=#668 id=668 data-nosnippet>668</a> }
<a href=#669 id=669 data-nosnippet>669</a>}
<a href=#670 id=670 data-nosnippet>670</a>
<a href=#671 id=671 data-nosnippet>671</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, <span class="kw">const </span>CAP: usize&gt; TryFrom&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>str&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#672 id=672 data-nosnippet>672</a>{
<a href=#673 id=673 data-nosnippet>673</a> <span class="kw">type </span>Error = CapacityError&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>str&gt;;
<a href=#674 id=674 data-nosnippet>674</a>
<a href=#675 id=675 data-nosnippet>675</a> <span class="kw">fn </span>try_from(f: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>str) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, <span class="self">Self</span>::Error&gt; {
<a href=#676 id=676 data-nosnippet>676</a> <span class="kw">let </span><span class="kw-2">mut </span>v = <span class="self">Self</span>::new();
<a href=#677 id=677 data-nosnippet>677</a> v.try_push_str(f)<span class="question-mark">?</span>;
<a href=#678 id=678 data-nosnippet>678</a> <span class="prelude-val">Ok</span>(v)
<a href=#679 id=679 data-nosnippet>679</a> }
<a href=#680 id=680 data-nosnippet>680</a>}
<a href=#681 id=681 data-nosnippet>681</a>
<a href=#682 id=682 data-nosnippet>682</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, <span class="kw">const </span>CAP: usize&gt; TryFrom&lt;fmt::Arguments&lt;<span class="lifetime">'a</span>&gt;&gt; <span class="kw">for </span>ArrayString&lt;CAP&gt;
<a href=#683 id=683 data-nosnippet>683</a>{
<a href=#684 id=684 data-nosnippet>684</a> <span class="kw">type </span>Error = CapacityError&lt;fmt::Error&gt;;
<a href=#685 id=685 data-nosnippet>685</a>
<a href=#686 id=686 data-nosnippet>686</a> <span class="kw">fn </span>try_from(f: fmt::Arguments&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, <span class="self">Self</span>::Error&gt; {
<a href=#687 id=687 data-nosnippet>687</a> <span class="kw">use </span>fmt::Write;
<a href=#688 id=688 data-nosnippet>688</a> <span class="kw">let </span><span class="kw-2">mut </span>v = <span class="self">Self</span>::new();
<a href=#689 id=689 data-nosnippet>689</a> v.write_fmt(f).map_err(|e| CapacityError::new(e))<span class="question-mark">?</span>;
<a href=#690 id=690 data-nosnippet>690</a> <span class="prelude-val">Ok</span>(v)
<a href=#691 id=691 data-nosnippet>691</a> }
<a href=#692 id=692 data-nosnippet>692</a>}
<a href=#693 id=693 data-nosnippet>693</a>
<a href=#694 id=694 data-nosnippet>694</a><span class="attr">#[cfg(feature = <span class="string">"zeroize"</span>)]
<a href=#695 id=695 data-nosnippet>695</a></span><span class="doccomment">/// "Best efforts" zeroing of the `ArrayString`'s buffer when the `zeroize` feature is enabled.
<a href=#696 id=696 data-nosnippet>696</a>///
<a href=#697 id=697 data-nosnippet>697</a>/// The length is set to 0, and the buffer is dropped and zeroized.
<a href=#698 id=698 data-nosnippet>698</a>/// Cannot ensure that previous moves of the `ArrayString` did not leave values on the stack.
<a href=#699 id=699 data-nosnippet>699</a>///
<a href=#700 id=700 data-nosnippet>700</a>/// ```
<a href=#701 id=701 data-nosnippet>701</a>/// use arrayvec::ArrayString;
<a href=#702 id=702 data-nosnippet>702</a>/// use zeroize::Zeroize;
<a href=#703 id=703 data-nosnippet>703</a>/// let mut string = ArrayString::&lt;6&gt;::from("foobar").unwrap();
<a href=#704 id=704 data-nosnippet>704</a>/// string.zeroize();
<a href=#705 id=705 data-nosnippet>705</a>/// assert_eq!(string.len(), 0);
<a href=#706 id=706 data-nosnippet>706</a>/// unsafe { string.set_len(string.capacity()) };
<a href=#707 id=707 data-nosnippet>707</a>/// assert_eq!(&amp;*string, "\0\0\0\0\0\0");
<a href=#708 id=708 data-nosnippet>708</a>/// ```
<a href=#709 id=709 data-nosnippet>709</a></span><span class="kw">impl</span>&lt;<span class="kw">const </span>CAP: usize&gt; zeroize::Zeroize <span class="kw">for </span>ArrayString&lt;CAP&gt; {
<a href=#710 id=710 data-nosnippet>710</a> <span class="kw">fn </span>zeroize(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#711 id=711 data-nosnippet>711</a> <span class="comment">// There are no elements to drop
<a href=#712 id=712 data-nosnippet>712</a> </span><span class="self">self</span>.clear();
<a href=#713 id=713 data-nosnippet>713</a> <span class="comment">// Zeroize the backing array.
<a href=#714 id=714 data-nosnippet>714</a> </span><span class="self">self</span>.xs.zeroize();
<a href=#715 id=715 data-nosnippet>715</a> }
<a href=#716 id=716 data-nosnippet>716</a>}
</code></pre></div></section></main></body></html>