Files
GopherGate/target/doc/bytemuck/trait.NoUninit.html
2026-02-26 12:00:21 -05:00

62 lines
17 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="Marker trait for “plain old data” types with no uninit (or padding) bytes."><title>NoUninit in bytemuck - Rust</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="bytemuck" 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="sidebar-items.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 trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">NoUninit</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../bytemuck/index.html">bytemuck</a><span class="version">1.25.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">NoUninit</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#derive" title="Derive">Derive</a></li><li><a href="#safety" title="Safety">Safety</a></li></ul><h3><a href="#foreign-impls">Implementations on Foreign Types</a></h3><ul class="block"><li><a href="#impl-NoUninit-for-NonZero%3Ci8%3E" title="NonZeroI8">NonZeroI8</a></li><li><a href="#impl-NoUninit-for-NonZero%3Ci16%3E" title="NonZeroI16">NonZeroI16</a></li><li><a href="#impl-NoUninit-for-NonZero%3Ci32%3E" title="NonZeroI32">NonZeroI32</a></li><li><a href="#impl-NoUninit-for-NonZero%3Ci64%3E" title="NonZeroI64">NonZeroI64</a></li><li><a href="#impl-NoUninit-for-NonZero%3Ci128%3E" title="NonZeroI128">NonZeroI128</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cisize%3E" title="NonZeroIsize">NonZeroIsize</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cu8%3E" title="NonZeroU8">NonZeroU8</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cu16%3E" title="NonZeroU16">NonZeroU16</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cu32%3E" title="NonZeroU32">NonZeroU32</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cu64%3E" title="NonZeroU64">NonZeroU64</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cu128%3E" title="NonZeroU128">NonZeroU128</a></li><li><a href="#impl-NoUninit-for-NonZero%3Cusize%3E" title="NonZeroUsize">NonZeroUsize</a></li><li><a href="#impl-NoUninit-for-bool" title="bool">bool</a></li><li><a href="#impl-NoUninit-for-char" title="char">char</a></li></ul><h3><a href="#dyn-compatibility">Dyn Compatibility</a></h3><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="index.html">In crate bytemuck</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="index.html">bytemuck</a></div><h1>Trait <span class="trait">NoUninit</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/bytemuck/no_uninit.rs.html#70">Source</a> </span></div><pre class="rust item-decl"><code>pub unsafe trait NoUninit:
<a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>
+ <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a>
+ 'static { }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Marker trait for “plain old data” types with no uninit (or padding) bytes.</p>
<p>The requirements for this is very similar to <a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a>,
except that it doesnt require that all bit patterns of the type are valid,
i.e. it does not require the type to be <a href="trait.Zeroable.html" title="trait bytemuck::Zeroable"><code>Zeroable</code></a>.
This limits what you can do with a type of this kind, but also broadens the
included types to things like C-style enums. Notably, you can only cast from
<em>immutable</em> references to a <a href="trait.NoUninit.html" title="trait bytemuck::NoUninit"><code>NoUninit</code></a> type into <em>immutable</em> references of
any other type, no casting of mutable references or mutable references to
slices etc.</p>
<p><a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a> is a subset of <a href="trait.NoUninit.html" title="trait bytemuck::NoUninit"><code>NoUninit</code></a>, meaning that any <code>T: Pod</code> is also
<a href="trait.NoUninit.html" title="trait bytemuck::NoUninit"><code>NoUninit</code></a> but any <code>T: NoUninit</code> is not necessarily <a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a>. If possible,
prefer implementing <a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a> directly. To get more <a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a>-like functionality
for a type that is only <a href="trait.NoUninit.html" title="trait bytemuck::NoUninit"><code>NoUninit</code></a>, consider also implementing
<a href="checked/trait.CheckedBitPattern.html" title="trait bytemuck::checked::CheckedBitPattern"><code>CheckedBitPattern</code></a>.</p>
<p>The rules for padding for various types and representations are documented
in the Rust reference section on <a href="https://doc.rust-lang.org/reference/type-layout.html">type layout</a>.</p>
<h2 id="derive"><a class="doc-anchor" href="#derive">§</a>Derive</h2>
<p>A <code>#[derive(NoUninit)]</code> macro is provided under the <code>derive</code> feature flag
which will automatically validate the requirements of this trait and
implement the trait for you for both enums and structs. This is the
recommended method for implementing the trait, however its also possible to
do manually. If you implement it manually, you <em>must</em> carefully follow the
below safety rules.</p>
<h2 id="safety"><a class="doc-anchor" href="#safety">§</a>Safety</h2>
<p>The same as <a href="trait.Pod.html" title="trait bytemuck::Pod"><code>Pod</code></a> except we disregard the rule about it must
allow any bit pattern (i.e. it does not need to be
<a href="trait.Zeroable.html" title="trait bytemuck::Zeroable"><code>Zeroable</code></a>). Still, this is a quite strong guarantee
about a type, so <em>be careful</em> whem implementing it manually.</p>
<ul>
<li>The type must be inhabited (eg: no
<a href="https://doc.rust-lang.org/1.93.1/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a>).</li>
<li>The type must not contain any uninit (or padding) bytes, either in the
middle or on the end (eg: no <code>#[repr(C)] struct Foo(u8, u16)</code>, which has
padding in the middle, and also no <code>#[repr(C)] struct Foo(u16, u8)</code>, which
has padding on the end).</li>
<li>Structs need to have all fields also be <code>NoUninit</code>.</li>
<li>Structs need to be <code>repr(C)</code> or <code>repr(transparent)</code>. In the case of
<code>repr(C)</code>, the <code>packed</code> and <code>align</code> repr modifiers can be used as long as
all other rules end up being followed.</li>
<li>Enums need to be <code>#[repr(Int)]</code>, <code>#[repr(C)]</code>, or both.</li>
<li>Enums may have fields. If the enum has fields,
<ul>
<li>Each variants fields must individually follow the same rules as a struct</li>
<li>All variants must be the same size, and require no padding-to-alignment</li>
<li>There must be no padding needed between the discriminant type and the
“fields struct” of any variant</li>
</ul>
</li>
<li>It is disallowed for types to contain pointer types, <code>Cell</code>, <code>UnsafeCell</code>,
atomics, and any other forms of interior mutability.</li>
<li>More precisely: A shared reference to the type must allow reads, and
<em>only</em> reads. RustBelts separation logic is based on the notion that a
type is allowed to define a sharing predicate, its own invariant that must
hold for shared references, and this predicate is the reasoning that allow
it to deal with atomic and cells etc. We require the sharing predicate to
be trivial and permit only read-only access.</li>
<li>Theres probably more, dont mess it up (I mean it).</li>
</ul>
</div></details><h2 id="dyn-compatibility" class="section-header">Dyn Compatibility<a href="#dyn-compatibility" class="anchor">§</a></h2><div class="dyn-compatibility-info"><p>This trait is <b>not</b> <a href="https://doc.rust-lang.org/1.93.1/reference/items/traits.html#dyn-compatibility">dyn compatible</a>.</p><p><i>In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.</i></p></div><h2 id="foreign-impls" class="section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><section id="impl-NoUninit-for-bool" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#76">Source</a><a href="#impl-NoUninit-for-bool" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="primitive" href="https://doc.rust-lang.org/1.93.1/core/primitive.bool.html">bool</a></h3></section><section id="impl-NoUninit-for-char" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#74">Source</a><a href="#impl-NoUninit-for-char" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="primitive" href="https://doc.rust-lang.org/1.93.1/core/primitive.char.html">char</a></h3></section><section id="impl-NoUninit-for-NonZero%3Ci8%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#79">Source</a><a href="#impl-NoUninit-for-NonZero%3Ci8%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroI8.html" title="type core::num::nonzero::NonZeroI8">NonZeroI8</a></h3></section><section id="impl-NoUninit-for-NonZero%3Ci16%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#81">Source</a><a href="#impl-NoUninit-for-NonZero%3Ci16%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroI16.html" title="type core::num::nonzero::NonZeroI16">NonZeroI16</a></h3></section><section id="impl-NoUninit-for-NonZero%3Ci32%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#83">Source</a><a href="#impl-NoUninit-for-NonZero%3Ci32%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroI32.html" title="type core::num::nonzero::NonZeroI32">NonZeroI32</a></h3></section><section id="impl-NoUninit-for-NonZero%3Ci64%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#85">Source</a><a href="#impl-NoUninit-for-NonZero%3Ci64%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroI64.html" title="type core::num::nonzero::NonZeroI64">NonZeroI64</a></h3></section><section id="impl-NoUninit-for-NonZero%3Ci128%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#87">Source</a><a href="#impl-NoUninit-for-NonZero%3Ci128%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroI128.html" title="type core::num::nonzero::NonZeroI128">NonZeroI128</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cisize%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#89">Source</a><a href="#impl-NoUninit-for-NonZero%3Cisize%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroIsize.html" title="type core::num::nonzero::NonZeroIsize">NonZeroIsize</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cu8%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#78">Source</a><a href="#impl-NoUninit-for-NonZero%3Cu8%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroU8.html" title="type core::num::nonzero::NonZeroU8">NonZeroU8</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cu16%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#80">Source</a><a href="#impl-NoUninit-for-NonZero%3Cu16%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroU16.html" title="type core::num::nonzero::NonZeroU16">NonZeroU16</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cu32%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#82">Source</a><a href="#impl-NoUninit-for-NonZero%3Cu32%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroU32.html" title="type core::num::nonzero::NonZeroU32">NonZeroU32</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cu64%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#84">Source</a><a href="#impl-NoUninit-for-NonZero%3Cu64%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroU64.html" title="type core::num::nonzero::NonZeroU64">NonZeroU64</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cu128%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#86">Source</a><a href="#impl-NoUninit-for-NonZero%3Cu128%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroU128.html" title="type core::num::nonzero::NonZeroU128">NonZeroU128</a></h3></section><section id="impl-NoUninit-for-NonZero%3Cusize%3E" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#88">Source</a><a href="#impl-NoUninit-for-NonZero%3Cusize%3E" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for <a class="type" href="https://doc.rust-lang.org/1.93.1/core/num/nonzero/type.NonZeroUsize.html" title="type core::num::nonzero::NonZeroUsize">NonZeroUsize</a></h3></section><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-NoUninit-for-T" class="impl"><a class="src rightside" href="../src/bytemuck/no_uninit.rs.html#72">Source</a><a href="#impl-NoUninit-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Pod.html" title="trait bytemuck::Pod">Pod</a>&gt; <a class="trait" href="trait.NoUninit.html" title="trait bytemuck::NoUninit">NoUninit</a> for T</h3></section></div><script src="../trait.impl/bytemuck/no_uninit/trait.NoUninit.js" data-ignore-extern-crates="core" async></script></section></div></main></body></html>