mpvrc/zerocopy/derive.AsBytes.html

76 lines
No EOL
7.4 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="Analyzes whether a type is `AsBytes`."><title>AsBytes in zerocopy - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Regular-0fe48ade.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" crossorigin href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-42caa33d.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="zerocopy" data-themes="" data-resource-suffix="" data-rustdoc-version="1.84.1 (e71f9a9a9 2025-01-27)" data-channel="1.84.1" data-search-js="search-92e6798f.js" data-settings-js="settings-0f613d39.js" ><script src="../static.files/storage-59e33391.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-5f194d8c.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-893ab5e7.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-6580c154.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc derive"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle" title="show sidebar"></button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../zerocopy/index.html">zerocopy</a><span class="version">0.7.35</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">AsBytes</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#error-messages" title="Error Messages">Error Messages</a></li><li><a href="#analysis" title="Analysis">Analysis</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="index.html">In crate zerocopy</a></h2></div></div></nav><div class="sidebar-resizer"></div><main><div class="width-limiter"><rustdoc-search></rustdoc-search><section id="main-content" class="content"><div class="main-heading"><span class="rustdoc-breadcrumbs"><a href="index.html">zerocopy</a></span><h1>Derive Macro <span class="derive">AsBytes</span><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/zerocopy_derive/lib.rs.html#269">Source</a> </span></div><pre class="rust item-decl"><code>#[derive(AsBytes)]</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Analyzes whether a type is <a href="trait.AsBytes.html" title="trait zerocopy::AsBytes"><code>AsBytes</code></a>.</p>
<p>This derive analyzes, at compile time, whether the annotated type satisfies
the <a href="trait.AsBytes.html#safety" title="trait zerocopy::AsBytes">safety conditions</a> of <code>AsBytes</code> and implements <code>AsBytes</code> if it is
sound to do so. This derive can be applied to structs, enums, and unions;
e.g.:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="attr">#[derive(AsBytes)]
#[repr(C)]
</span><span class="kw">struct </span>MyStruct {
...
}
<span class="attr">#[derive(AsBytes)]
#[repr(u8)]
</span><span class="kw">enum </span>MyEnum {
...
}
<span class="attr">#[derive(AsBytes)]
#[repr(C)]
</span><span class="kw">union </span>MyUnion {
...
}</code></pre></div>
<h2 id="error-messages"><a class="doc-anchor" href="#error-messages">§</a>Error Messages</h2>
<p>Due to the way that the custom derive for <code>AsBytes</code> is implemented, you may
get an error like this:</p>
<div class="example-wrap"><pre class="language-text"><code>error[E0277]: the trait bound `HasPadding&lt;Foo, true&gt;: ShouldBe&lt;false&gt;` is not satisfied
--&gt; lib.rs:23:10
|
1 | #[derive(AsBytes)]
| ^^^^^^^ the trait `ShouldBe&lt;false&gt;` is not implemented for `HasPadding&lt;Foo, true&gt;`
|
= help: the trait `ShouldBe&lt;VALUE&gt;` is implemented for `HasPadding&lt;T, VALUE&gt;`</code></pre></div>
<p>This error indicates that the type being annotated has padding bytes, which
is illegal for <code>AsBytes</code> types. Consider reducing the alignment of some
fields by using types in the <a href="byteorder/index.html" title="mod zerocopy::byteorder"><code>byteorder</code></a> module, adding explicit struct
fields where those padding bytes would be, or using <code>#[repr(packed)]</code>. See
the Rust References page on <a href="https://doc.rust-lang.org/reference/type-layout.html">type layout</a> for more information
about type layout and padding.</p>
<h2 id="analysis"><a class="doc-anchor" href="#analysis">§</a>Analysis</h2>
<p><em>This section describes, roughly, the analysis performed by this derive to
determine whether it is sound to implement <code>AsBytes</code> for a given type.
Unless you are modifying the implementation of this derive, or attempting to
manually implement <code>AsBytes</code> for a type yourself, you dont need to read
this section.</em></p>
<p>If a type has the following properties, then this derive can implement
<code>AsBytes</code> for that type:</p>
<ul>
<li>If the type is a struct:
<ul>
<li>It must have a defined representation (<code>repr(C)</code>, <code>repr(transparent)</code>,
or <code>repr(packed)</code>).</li>
<li>All of its fields must be <code>AsBytes</code>.</li>
<li>Its layout must have no padding. This is always true for
<code>repr(transparent)</code> and <code>repr(packed)</code>. For <code>repr(C)</code>, see the layout
algorithm described in the <a href="https://doc.rust-lang.org/reference/type-layout.html">Rust Reference</a>.</li>
</ul>
</li>
<li>If the type is an enum:
<ul>
<li>It must be a C-like enum (meaning that all variants have no fields).</li>
<li>It must have a defined representation (<code>repr</code>s <code>C</code>, <code>u8</code>, <code>u16</code>, <code>u32</code>,
<code>u64</code>, <code>usize</code>, <code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, or <code>isize</code>).</li>
</ul>
</li>
<li>The type must not contain any <a href="https://doc.rust-lang.org/1.84.1/core/cell/struct.UnsafeCell.html" title="struct core::cell::UnsafeCell"><code>UnsafeCell</code></a>s (this is required in order
for it to be sound to construct a <code>&amp;[u8]</code> and a <code>&amp;T</code> to the same region of
memory). The type may contain references or pointers to <code>UnsafeCell</code>s so
long as those values can themselves be initialized from zeroes (<code>AsBytes</code>
is not currently implemented for, e.g., <code>Option&lt;&amp;UnsafeCell&lt;_&gt;&gt;</code>, but it
could be one day).</li>
</ul>
<p>This analysis is subject to change. Unsafe code may <em>only</em> rely on the
documented <a href="trait.AsBytes.html#safety" title="trait zerocopy::AsBytes">safety conditions</a> of <code>FromBytes</code>, and must <em>not</em> rely on the
implementation details of this derive.</p>
</div></details></section></div></main></body></html>