Files
mercator_service/nom/lib/std/mem/fn.transmute.html

181 lines
26 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="API documentation for the Rust `transmute` fn in crate `nom`."><meta name="keywords" content="rust, rustlang, rust-lang, transmute"><title>nom::lib::std::mem::transmute - Rust</title><link rel="stylesheet" type="text/css" href="../../../../normalize.css"><link rel="stylesheet" type="text/css" href="../../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../../../dark.css"><link rel="stylesheet" type="text/css" href="../../../../light.css" id="themeStyle"><script src="../../../../storage.js"></script><noscript><link rel="stylesheet" href="../../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../../down-arrow.svg");}</style></head><body class="rustdoc fn"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../../../nom/index.html'><div class='logo-container'><img src='../../../../rust-logo.png' alt='logo'></div></a><div class="sidebar-elems"><p class='location'><a href='../../../index.html'>nom</a>::<wbr><a href='../../index.html'>lib</a>::<wbr><a href='../index.html'>std</a>::<wbr><a href='index.html'>mem</a></p><script>window.sidebarCurrent = {name: 'transmute', ty: 'fn', relpath: ''};</script><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../../../settings.html"><img src="../../../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class='fqn'><span class='out-of-band'><span class='since' title='Stable since Rust version 1.0.0'>1.0.0</span><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>&#x2212;</span>]</a></span><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/intrinsics.rs.html#1267' title='goto source code'>[src]</a></span><span class='in-band'>Function <a href='../../../index.html'>nom</a>::<wbr><a href='../../index.html'>lib</a>::<wbr><a href='../index.html'>std</a>::<wbr><a href='index.html'>mem</a>::<wbr><a class="fn" href=''>transmute</a></span></h1><pre class='rust fn'>pub const unsafe extern &quot;rust-intrinsic&quot; fn transmute&lt;T, U&gt;(e: T) -&gt; U</pre><div class='docblock'><p>Reinterprets the bits of a value of one type as another type.</p>
<p>Both types must have the same size. Neither the original, nor the result,
may be an <a href="../../nomicon/what-unsafe-does.html">invalid value</a>.</p>
<p><code>transmute</code> is semantically equivalent to a bitwise move of one type
into another. It copies the bits from the source value into the
destination value, then forgets the original. It's equivalent to C's
<code>memcpy</code> under the hood, just like <code>transmute_copy</code>.</p>
<p><code>transmute</code> is <strong>incredibly</strong> unsafe. There are a vast number of ways to
cause <a href="../../reference/behavior-considered-undefined.html">undefined behavior</a> with this function. <code>transmute</code> should be
the absolute last resort.</p>
<p>The <a href="../../nomicon/transmutes.html">nomicon</a> has additional
documentation.</p>
<h1 id="examples" class="section-header"><a href="#examples">Examples</a></h1>
<p>There are a few things that <code>transmute</code> is really useful for.</p>
<p>Turning a pointer into a function pointer. This is <em>not</em> portable to
machines where function pointers and data pointers have different sizes.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">fn</span> <span class="ident">foo</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="number">0</span>
}
<span class="kw">let</span> <span class="ident">pointer</span> <span class="op">=</span> <span class="ident">foo</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw">const</span> ();
<span class="kw">let</span> <span class="ident">function</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">*</span><span class="kw">const</span> (), <span class="kw">fn</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span><span class="op">&gt;</span>(<span class="ident">pointer</span>)
};
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">function</span>(), <span class="number">0</span>);</pre></div>
<p>Extending a lifetime, or shortening an invariant lifetime. This is
advanced, very unsafe Rust!</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">struct</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span>(<span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">i32</span>);
<span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">extend_lifetime</span><span class="op">&lt;</span><span class="lifetime">&#39;b</span><span class="op">&gt;</span>(<span class="ident">r</span>: <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;b</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span><span class="op">&gt;</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;b</span><span class="op">&gt;</span>, <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="ident">r</span>)
}
<span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">shorten_invariant_lifetime</span><span class="op">&lt;</span><span class="lifetime">&#39;b</span>, <span class="lifetime">&#39;c</span><span class="op">&gt;</span>(<span class="ident">r</span>: <span class="kw-2">&amp;</span><span class="lifetime">&#39;b</span> <span class="kw-2">mut</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span><span class="op">&gt;</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="lifetime">&#39;b</span> <span class="kw-2">mut</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;c</span><span class="op">&gt;</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;b</span> <span class="kw-2">mut</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span><span class="op">&gt;</span>, <span class="kw-2">&amp;</span><span class="lifetime">&#39;b</span> <span class="kw-2">mut</span> <span class="ident">R</span><span class="op">&lt;</span><span class="lifetime">&#39;c</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="ident">r</span>)
}</pre></div>
<h1 id="alternatives" class="section-header"><a href="#alternatives">Alternatives</a></h1>
<p>Don't despair: many uses of <code>transmute</code> can be achieved through other means.
Below are common applications of <code>transmute</code> which can be replaced with safer
constructs.</p>
<p>Turning a pointer into a <code>usize</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">let</span> <span class="ident">ptr</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="number">0</span>;
<span class="kw">let</span> <span class="ident">ptr_num_transmute</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span>, <span class="ident">usize</span><span class="op">&gt;</span>(<span class="ident">ptr</span>)
};
<span class="comment">// Use an `as` cast instead</span>
<span class="kw">let</span> <span class="ident">ptr_num_cast</span> <span class="op">=</span> <span class="ident">ptr</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw">const</span> <span class="ident">i32</span> <span class="kw">as</span> <span class="ident">usize</span>;</pre></div>
<p>Turning a <code>*mut T</code> into an <code>&amp;mut T</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">let</span> <span class="ident">ptr</span>: <span class="kw-2">*</span><span class="kw-2">mut</span> <span class="ident">i32</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="ident">ref_transmuted</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">*</span><span class="kw-2">mut</span> <span class="ident">i32</span>, <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">i32</span><span class="op">&gt;</span>(<span class="ident">ptr</span>)
};
<span class="comment">// Use a reborrow instead</span>
<span class="kw">let</span> <span class="ident">ref_casted</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="kw-2">*</span><span class="ident">ptr</span> };</pre></div>
<p>Turning an <code>&amp;mut T</code> into an <code>&amp;mut U</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">let</span> <span class="ident">ptr</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="ident">val_transmuted</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">i32</span>, <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">u32</span><span class="op">&gt;</span>(<span class="ident">ptr</span>)
};
<span class="comment">// Now, put together `as` and reborrowing - note the chaining of `as`</span>
<span class="comment">// `as` is not transitive</span>
<span class="kw">let</span> <span class="ident">val_casts</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="kw-2">*</span>(<span class="ident">ptr</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw-2">mut</span> <span class="ident">i32</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw-2">mut</span> <span class="ident">u32</span>) };</pre></div>
<p>Turning an <code>&amp;str</code> into an <code>&amp;[u8]</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="comment">// this is not a good way to do this.</span>
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="kw-2">&amp;</span>[<span class="ident">u8</span>]<span class="op">&gt;</span>(<span class="string">&quot;Rust&quot;</span>) };
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">slice</span>, <span class="kw-2">&amp;</span>[<span class="number">82</span>, <span class="number">117</span>, <span class="number">115</span>, <span class="number">116</span>]);
<span class="comment">// You could use `str::as_bytes`</span>
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="string">&quot;Rust&quot;</span>.<span class="ident">as_bytes</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">slice</span>, <span class="kw-2">&amp;</span>[<span class="number">82</span>, <span class="number">117</span>, <span class="number">115</span>, <span class="number">116</span>]);
<span class="comment">// Or, just use a byte string, if you have control over the string</span>
<span class="comment">// literal</span>
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="string">b&quot;Rust&quot;</span>, <span class="kw-2">&amp;</span>[<span class="number">82</span>, <span class="number">117</span>, <span class="number">115</span>, <span class="number">116</span>]);</pre></div>
<p>Turning a <code>Vec&lt;&amp;T&gt;</code> into a <code>Vec&lt;Option&lt;&amp;T&gt;&gt;</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">let</span> <span class="ident">store</span> <span class="op">=</span> [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>];
<span class="kw">let</span> <span class="ident">v_orig</span> <span class="op">=</span> <span class="ident">store</span>.<span class="ident">iter</span>().<span class="ident">collect</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span><span class="op">&gt;</span><span class="op">&gt;</span>();
<span class="comment">// clone the vector as we will reuse them later</span>
<span class="kw">let</span> <span class="ident">v_clone</span> <span class="op">=</span> <span class="ident">v_orig</span>.<span class="ident">clone</span>();
<span class="comment">// Using transmute: this relies on the unspecified data layout of `Vec`, which is a</span>
<span class="comment">// bad idea and could cause Undefined Behavior.</span>
<span class="comment">// However, it is no-copy.</span>
<span class="kw">let</span> <span class="ident">v_transmuted</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span><span class="op">&gt;</span>, <span class="ident">Vec</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>(<span class="ident">v_clone</span>)
};
<span class="kw">let</span> <span class="ident">v_clone</span> <span class="op">=</span> <span class="ident">v_orig</span>.<span class="ident">clone</span>();
<span class="comment">// This is the suggested, safe way.</span>
<span class="comment">// It does copy the entire vector, though, into a new array.</span>
<span class="kw">let</span> <span class="ident">v_collected</span> <span class="op">=</span> <span class="ident">v_clone</span>.<span class="ident">into_iter</span>()
.<span class="ident">map</span>(<span class="prelude-val">Some</span>)
.<span class="ident">collect</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>();
<span class="kw">let</span> <span class="ident">v_clone</span> <span class="op">=</span> <span class="ident">v_orig</span>.<span class="ident">clone</span>();
<span class="comment">// The no-copy, unsafe way, still using transmute, but not relying on the data layout.</span>
<span class="comment">// Like the first approach, this reuses the `Vec` internals.</span>
<span class="comment">// Therefore, the new inner type must have the</span>
<span class="comment">// exact same size, *and the same alignment*, as the old type.</span>
<span class="comment">// The same caveats exist for this method as transmute, for</span>
<span class="comment">// the original inner type (`&amp;i32`) to the converted inner type</span>
<span class="comment">// (`Option&lt;&amp;i32&gt;`), so read the nomicon pages linked above and also</span>
<span class="comment">// consult the [`from_raw_parts`] documentation.</span>
<span class="kw">let</span> <span class="ident">v_from_raw</span> <span class="op">=</span> <span class="kw">unsafe</span> {
<span class="comment">// Ensure the original vector is not dropped.</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">v_clone</span> <span class="op">=</span> <span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">ManuallyDrop</span>::<span class="ident">new</span>(<span class="ident">v_clone</span>);
<span class="ident">Vec</span>::<span class="ident">from_raw_parts</span>(<span class="ident">v_clone</span>.<span class="ident">as_mut_ptr</span>() <span class="kw">as</span> <span class="kw-2">*</span><span class="kw-2">mut</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="ident">i32</span><span class="op">&gt;</span>,
<span class="ident">v_clone</span>.<span class="ident">len</span>(),
<span class="ident">v_clone</span>.<span class="ident">capacity</span>())
};</pre></div>
<p>Implementing <code>split_at_mut</code>:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered">
<span class="kw">use</span> <span class="ident">std</span>::{<span class="ident">slice</span>, <span class="ident">mem</span>};
<span class="comment">// There are multiple ways to do this, and there are multiple problems</span>
<span class="comment">// with the following (transmute) way.</span>
<span class="kw">fn</span> <span class="ident">split_at_mut_transmute</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="ident">slice</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="ident">mid</span>: <span class="ident">usize</span>)
<span class="op">-</span><span class="op">&gt;</span> (<span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>]) {
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">mid</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">len</span>);
<span class="kw">unsafe</span> {
<span class="kw">let</span> <span class="ident">slice2</span> <span class="op">=</span> <span class="ident">mem</span>::<span class="ident">transmute</span>::<span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>]<span class="op">&gt;</span>(<span class="ident">slice</span>);
<span class="comment">// first: transmute is not typesafe; all it checks is that T and</span>
<span class="comment">// U are of the same size. Second, right here, you have two</span>
<span class="comment">// mutable references pointing to the same memory.</span>
(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">slice</span>[<span class="number">0</span>..<span class="ident">mid</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">slice2</span>[<span class="ident">mid</span>..<span class="ident">len</span>])
}
}
<span class="comment">// This gets rid of the typesafety problems; `&amp;mut *` will *only* give</span>
<span class="comment">// you an `&amp;mut T` from an `&amp;mut T` or `*mut T`.</span>
<span class="kw">fn</span> <span class="ident">split_at_mut_casts</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="ident">slice</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="ident">mid</span>: <span class="ident">usize</span>)
<span class="op">-</span><span class="op">&gt;</span> (<span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>]) {
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">mid</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">len</span>);
<span class="kw">unsafe</span> {
<span class="kw">let</span> <span class="ident">slice2</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="kw-2">*</span>(<span class="ident">slice</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw-2">mut</span> [<span class="ident">T</span>]);
<span class="comment">// however, you still have two mutable references pointing to</span>
<span class="comment">// the same memory.</span>
(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">slice</span>[<span class="number">0</span>..<span class="ident">mid</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">slice2</span>[<span class="ident">mid</span>..<span class="ident">len</span>])
}
}
<span class="comment">// This is how the standard library does it. This is the best method, if</span>
<span class="comment">// you need to do something like this</span>
<span class="kw">fn</span> <span class="ident">split_at_stdlib</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="ident">slice</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="ident">mid</span>: <span class="ident">usize</span>)
<span class="op">-</span><span class="op">&gt;</span> (<span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>], <span class="kw-2">&amp;</span><span class="kw-2">mut</span> [<span class="ident">T</span>]) {
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">mid</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">len</span>);
<span class="kw">unsafe</span> {
<span class="kw">let</span> <span class="ident">ptr</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">as_mut_ptr</span>();
<span class="comment">// This now has three mutable references pointing at the same</span>
<span class="comment">// memory. `slice`, the rvalue ret.0, and the rvalue ret.1.</span>
<span class="comment">// `slice` is never used after `let ptr = ...`, and so one can</span>
<span class="comment">// treat it as &quot;dead&quot;, and therefore, you only have two real</span>
<span class="comment">// mutable slices.</span>
(<span class="ident">slice</span>::<span class="ident">from_raw_parts_mut</span>(<span class="ident">ptr</span>, <span class="ident">mid</span>),
<span class="ident">slice</span>::<span class="ident">from_raw_parts_mut</span>(<span class="ident">ptr</span>.<span class="ident">add</span>(<span class="ident">mid</span>), <span class="ident">len</span> <span class="op">-</span> <span class="ident">mid</span>))
}
}</pre></div>
</div></section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../../../";window.currentCrate = "nom";</script><script src="../../../../aliases.js"></script><script src="../../../../main.js"></script><script defer src="../../../../search-index.js"></script></body></html>