|
|
|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
<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 to the Rust file `/home/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/lazy_static-0.1.16/src/lib.rs`.">
|
|
|
|
|
<meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/lazy_static-0.2.11/src/lib.rs`.">
|
|
|
|
|
<meta name="keywords" content="rust, rustlang, rust-lang">
|
|
|
|
|
|
|
|
|
|
<title>lib.rs.html -- source</title>
|
|
|
|
|
@@ -211,7 +211,69 @@
|
|
|
|
|
<span id="155">155</span>
|
|
|
|
|
<span id="156">156</span>
|
|
|
|
|
<span id="157">157</span>
|
|
|
|
|
<span id="158">158</span>
|
|
|
|
|
<span id="159">159</span>
|
|
|
|
|
<span id="160">160</span>
|
|
|
|
|
<span id="161">161</span>
|
|
|
|
|
<span id="162">162</span>
|
|
|
|
|
<span id="163">163</span>
|
|
|
|
|
<span id="164">164</span>
|
|
|
|
|
<span id="165">165</span>
|
|
|
|
|
<span id="166">166</span>
|
|
|
|
|
<span id="167">167</span>
|
|
|
|
|
<span id="168">168</span>
|
|
|
|
|
<span id="169">169</span>
|
|
|
|
|
<span id="170">170</span>
|
|
|
|
|
<span id="171">171</span>
|
|
|
|
|
<span id="172">172</span>
|
|
|
|
|
<span id="173">173</span>
|
|
|
|
|
<span id="174">174</span>
|
|
|
|
|
<span id="175">175</span>
|
|
|
|
|
<span id="176">176</span>
|
|
|
|
|
<span id="177">177</span>
|
|
|
|
|
<span id="178">178</span>
|
|
|
|
|
<span id="179">179</span>
|
|
|
|
|
<span id="180">180</span>
|
|
|
|
|
<span id="181">181</span>
|
|
|
|
|
<span id="182">182</span>
|
|
|
|
|
<span id="183">183</span>
|
|
|
|
|
<span id="184">184</span>
|
|
|
|
|
<span id="185">185</span>
|
|
|
|
|
<span id="186">186</span>
|
|
|
|
|
<span id="187">187</span>
|
|
|
|
|
<span id="188">188</span>
|
|
|
|
|
<span id="189">189</span>
|
|
|
|
|
<span id="190">190</span>
|
|
|
|
|
<span id="191">191</span>
|
|
|
|
|
<span id="192">192</span>
|
|
|
|
|
<span id="193">193</span>
|
|
|
|
|
<span id="194">194</span>
|
|
|
|
|
<span id="195">195</span>
|
|
|
|
|
<span id="196">196</span>
|
|
|
|
|
<span id="197">197</span>
|
|
|
|
|
<span id="198">198</span>
|
|
|
|
|
<span id="199">199</span>
|
|
|
|
|
<span id="200">200</span>
|
|
|
|
|
<span id="201">201</span>
|
|
|
|
|
<span id="202">202</span>
|
|
|
|
|
<span id="203">203</span>
|
|
|
|
|
<span id="204">204</span>
|
|
|
|
|
<span id="205">205</span>
|
|
|
|
|
<span id="206">206</span>
|
|
|
|
|
<span id="207">207</span>
|
|
|
|
|
<span id="208">208</span>
|
|
|
|
|
<span id="209">209</span>
|
|
|
|
|
<span id="210">210</span>
|
|
|
|
|
<span id="211">211</span>
|
|
|
|
|
<span id="212">212</span>
|
|
|
|
|
</pre><pre class="rust ">
|
|
|
|
|
<span class="comment">// Copyright 2016 lazy-static.rs Developers</span>
|
|
|
|
|
<span class="comment">//</span>
|
|
|
|
|
<span class="comment">// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or</span>
|
|
|
|
|
<span class="comment">// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or</span>
|
|
|
|
|
<span class="comment">// http://opensource.org/licenses/MIT>, at your option. This file may not be</span>
|
|
|
|
|
<span class="comment">// copied, modified, or distributed except according to those terms.</span>
|
|
|
|
|
|
|
|
|
|
<span class="doccomment">/*!
|
|
|
|
|
A macro for declaring lazily evaluated statics.
|
|
|
|
|
|
|
|
|
|
@@ -231,19 +293,34 @@ lazy_static! {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Metadata (such as doc comments) is allowed on each ref.
|
|
|
|
|
Attributes (including doc comments) are supported as well:
|
|
|
|
|
|
|
|
|
|
# Semantic
|
|
|
|
|
```rust
|
|
|
|
|
# #[macro_use]
|
|
|
|
|
# extern crate lazy_static;
|
|
|
|
|
# fn main() {
|
|
|
|
|
lazy_static! {
|
|
|
|
|
/// This is an example for using doc comment attributes
|
|
|
|
|
static ref EXAMPLE: u8 = 42;
|
|
|
|
|
}
|
|
|
|
|
# }
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Semantics
|
|
|
|
|
|
|
|
|
|
For a given `static ref NAME: TYPE = EXPR;`, the macro generates a unique type that
|
|
|
|
|
implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Metadata ends up
|
|
|
|
|
implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Attributes end up
|
|
|
|
|
attaching to this type.)
|
|
|
|
|
|
|
|
|
|
On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
|
|
|
|
|
can return a reference to the same object.
|
|
|
|
|
can return a reference to the same object. Note that this can lead to deadlocks
|
|
|
|
|
if you have multiple lazy statics that depend on each other in their initialization.
|
|
|
|
|
|
|
|
|
|
Like regular `static mut`s, this macro only works for types that fulfill the `Sync`
|
|
|
|
|
trait.
|
|
|
|
|
Apart from the lazy initialization, the resulting "static ref" variables
|
|
|
|
|
have generally the same properties as regular "static" variables:
|
|
|
|
|
|
|
|
|
|
- Any type in them needs to fulfill the `Sync` trait.
|
|
|
|
|
- If the type has a destructor, then it will not run when the process exits.
|
|
|
|
|
|
|
|
|
|
# Example
|
|
|
|
|
|
|
|
|
|
@@ -282,93 +359,126 @@ The `Deref` implementation uses a hidden static variable that is guarded by a at
|
|
|
|
|
|
|
|
|
|
*/</span>
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#![<span class="ident">cfg_attr</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>, <span class="ident">feature</span>(<span class="ident">const_fn</span>, <span class="ident">core_intrinsics</span>))]</span>
|
|
|
|
|
<span class="attribute">#![<span class="ident">crate_type</span> <span class="op">=</span> <span class="string">"dylib"</span>]</span>
|
|
|
|
|
<span class="attribute">#![<span class="ident">cfg_attr</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"spin_no_std"</span>, <span class="ident">feature</span>(<span class="ident">const_fn</span>))]</span>
|
|
|
|
|
<span class="attribute">#![<span class="ident">cfg_attr</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>, <span class="ident">feature</span>(<span class="ident">unreachable</span>))]</span>
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">"https://docs.rs/lazy_static/0.2.11"</span>)]</span>
|
|
|
|
|
<span class="attribute">#![<span class="ident">no_std</span>]</span>
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>))]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">lazy</span>;
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>, <span class="ident">not</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"spin_no_std"</span>)))]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">path</span><span class="op">=</span><span class="string">"nightly_lazy.rs"</span>]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">lazy</span>;
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>, <span class="ident">feature</span><span class="op">=</span><span class="string">"spin_no_std"</span>))]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">path</span><span class="op">=</span><span class="string">"core_lazy.rs"</span>]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">lazy</span>;
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">core</span>::<span class="ident">ops</span>::<span class="ident">Deref</span> <span class="kw">as</span> <span class="ident">__Deref</span>;
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">macro_export</span>]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">__lazy_static_internal</span> {
|
|
|
|
|
<span class="comment">// optional visibility restrictions are wrapped in `()` to allow for</span>
|
|
|
|
|
<span class="comment">// explicitly passing otherwise implicit information about private items</span>
|
|
|
|
|
($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="op">*</span> ($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="macro">__lazy_static_internal</span><span class="macro">!</span>(@<span class="ident">MAKE</span> <span class="ident">TY</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="kw-2">*</span>, ($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>)<span class="kw-2">*</span>), <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>);
|
|
|
|
|
<span class="macro">__lazy_static_internal</span><span class="macro">!</span>(@<span class="ident">TAIL</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>);
|
|
|
|
|
<span class="macro">lazy_static</span><span class="macro">!</span>($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
};
|
|
|
|
|
(@<span class="ident">TAIL</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="kw">impl</span> <span class="macro-nonterminal">$</span><span class="kw">crate</span>::<span class="macro-nonterminal">__Deref</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {
|
|
|
|
|
<span class="kw">type</span> <span class="ident">Target</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>;
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">unsafe_code</span>)]</span>
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">deref</span>(<span class="kw-2">&</span><span class="self">self</span>) <span class="op">-></span> <span class="kw-2">&</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> {
|
|
|
|
|
<span class="kw">unsafe</span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">__static_ref_initialize</span>() <span class="op">-></span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> { <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span> }
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">__stability</span>() <span class="op">-></span> <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> {
|
|
|
|
|
<span class="macro">__lazy_static_create</span><span class="macro">!</span>(<span class="ident">LAZY</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>);
|
|
|
|
|
<span class="ident">LAZY</span>.<span class="ident">get</span>(<span class="ident">__static_ref_initialize</span>)
|
|
|
|
|
}
|
|
|
|
|
<span class="ident">__stability</span>()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
<span class="kw">impl</span> <span class="macro-nonterminal">$</span><span class="kw">crate</span>::<span class="macro-nonterminal">LazyStatic</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">initialize</span>(<span class="ident">lazy</span>: <span class="kw-2">&</span><span class="self">Self</span>) {
|
|
|
|
|
<span class="kw">let</span> _ <span class="op">=</span> <span class="kw-2">&</span><span class="kw-2">*</span><span class="kw-2">*</span><span class="ident">lazy</span>;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
<span class="comment">// `vis` is wrapped in `()` to prevent parsing ambiguity</span>
|
|
|
|
|
(@<span class="ident">MAKE</span> <span class="ident">TY</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="kw-2">*</span>, ($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>), <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">missing_copy_implementations</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_camel_case_types</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
|
|
|
|
$(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span>
|
|
|
|
|
$(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>)<span class="op">*</span> <span class="kw">struct</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()}
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
$(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>)<span class="op">*</span> <span class="kw">static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>: <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()};
|
|
|
|
|
};
|
|
|
|
|
() <span class="op">=></span> ()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">macro_export</span>]</span>
|
|
|
|
|
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">lazy_static</span> {
|
|
|
|
|
($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="op">*</span> <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="macro">lazy_static</span><span class="macro">!</span>(<span class="ident">PRIV</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span> <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
<span class="comment">// use `()` to explicitly forward the information about private items</span>
|
|
|
|
|
<span class="macro">__lazy_static_internal</span><span class="macro">!</span>($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span> () <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
};
|
|
|
|
|
($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="op">*</span> <span class="kw">pub</span> <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="macro">lazy_static</span><span class="macro">!</span>(<span class="ident">PUB</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span> <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
<span class="macro">__lazy_static_internal</span><span class="macro">!</span>($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span> (<span class="kw">pub</span>) <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
};
|
|
|
|
|
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">VIS</span>:<span class="ident">ident</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="op">*</span> <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="macro">lazy_static</span><span class="macro">!</span>(<span class="ident">MAKE</span> <span class="ident">TY</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">VIS</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="kw-2">*</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>);
|
|
|
|
|
<span class="kw">impl</span> ::<span class="ident">std</span>::<span class="ident">ops</span>::<span class="ident">Deref</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {
|
|
|
|
|
<span class="kw">type</span> <span class="ident">Target</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>;
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">deref</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>(<span class="kw-2">&</span><span class="lifetime">'a</span> <span class="self">self</span>) <span class="op">-></span> <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">__static_ref_initialize</span>() <span class="op">-></span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> { <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span> }
|
|
|
|
|
|
|
|
|
|
<span class="kw">unsafe</span> {
|
|
|
|
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">sync</span>::{<span class="ident">Once</span>, <span class="ident">ONCE_INIT</span>};
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">require_sync</span><span class="op"><</span><span class="ident">T</span>: <span class="ident">Sync</span><span class="op">></span>(_: <span class="kw-2">&</span><span class="ident">T</span>) { }
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>)]</span>
|
|
|
|
|
<span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">__stability</span>() <span class="op">-></span> <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> {
|
|
|
|
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">cell</span>::<span class="ident">UnsafeCell</span>;
|
|
|
|
|
|
|
|
|
|
<span class="kw">struct</span> <span class="ident">SyncCell</span>(<span class="ident">UnsafeCell</span><span class="op"><</span><span class="prelude-ty">Option</span><span class="op"><</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span><span class="op">>></span>);
|
|
|
|
|
<span class="kw">unsafe</span> <span class="kw">impl</span> <span class="ident">Sync</span> <span class="kw">for</span> <span class="ident">SyncCell</span> {}
|
|
|
|
|
|
|
|
|
|
<span class="kw">static</span> <span class="ident">DATA</span>: <span class="ident">SyncCell</span> <span class="op">=</span> <span class="ident">SyncCell</span>(<span class="ident">UnsafeCell</span>::<span class="ident">new</span>(<span class="prelude-val">None</span>));
|
|
|
|
|
<span class="kw">static</span> <span class="ident">ONCE</span>: <span class="ident">Once</span> <span class="op">=</span> <span class="ident">ONCE_INIT</span>;
|
|
|
|
|
<span class="ident">ONCE</span>.<span class="ident">call_once</span>(<span class="op">||</span> {
|
|
|
|
|
<span class="kw-2">*</span><span class="ident">DATA</span>.<span class="number">0</span>.<span class="ident">get</span>() <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">__static_ref_initialize</span>());
|
|
|
|
|
});
|
|
|
|
|
<span class="kw">match</span> <span class="kw-2">*</span><span class="ident">DATA</span>.<span class="number">0</span>.<span class="ident">get</span>() {
|
|
|
|
|
<span class="prelude-val">Some</span>(<span class="kw-2">ref</span> <span class="ident">x</span>) <span class="op">=></span> <span class="ident">x</span>,
|
|
|
|
|
<span class="prelude-val">None</span> <span class="op">=></span> ::<span class="ident">std</span>::<span class="ident">intrinsics</span>::<span class="ident">unreachable</span>(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="attribute">#[<span class="ident">inline</span>(<span class="ident">always</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">feature</span><span class="op">=</span><span class="string">"nightly"</span>))]</span>
|
|
|
|
|
<span class="kw">unsafe</span> <span class="kw">fn</span> <span class="ident">__stability</span>() <span class="op">-></span> <span class="kw-2">&</span><span class="lifetime">'static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> {
|
|
|
|
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">mem</span>::<span class="ident">transmute</span>;
|
|
|
|
|
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">boxed</span>::<span class="ident">Box</span>;
|
|
|
|
|
|
|
|
|
|
<span class="kw">static</span> <span class="kw-2">mut</span> <span class="ident">DATA</span>: <span class="kw-2">*</span><span class="kw">const</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="number">0</span> <span class="kw">as</span> <span class="kw-2">*</span><span class="kw">const</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>;
|
|
|
|
|
<span class="kw">static</span> <span class="kw-2">mut</span> <span class="ident">ONCE</span>: <span class="ident">Once</span> <span class="op">=</span> <span class="ident">ONCE_INIT</span>;
|
|
|
|
|
<span class="ident">ONCE</span>.<span class="ident">call_once</span>(<span class="op">||</span> {
|
|
|
|
|
<span class="ident">DATA</span> <span class="op">=</span> <span class="ident">transmute</span>::<span class="op"><</span><span class="ident">Box</span><span class="op"><</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span><span class="op">></span>, <span class="kw-2">*</span><span class="kw">const</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span><span class="op">></span>(
|
|
|
|
|
<span class="ident">Box</span>::<span class="ident">new</span>(<span class="ident">__static_ref_initialize</span>()));
|
|
|
|
|
});
|
|
|
|
|
<span class="kw-2">&</span><span class="kw-2">*</span><span class="ident">DATA</span>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="kw">let</span> <span class="ident">static_ref</span> <span class="op">=</span> <span class="ident">__stability</span>();
|
|
|
|
|
<span class="ident">require_sync</span>(<span class="ident">static_ref</span>);
|
|
|
|
|
<span class="ident">static_ref</span>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
<span class="macro">lazy_static</span><span class="macro">!</span>($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
};
|
|
|
|
|
(<span class="ident">MAKE</span> <span class="ident">TY</span>, <span class="ident">PUB</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="kw-2">*</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">missing_copy_implementations</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_camel_case_types</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
|
|
|
|
$(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">struct</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()}
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>: <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()};
|
|
|
|
|
};
|
|
|
|
|
(<span class="ident">MAKE</span> <span class="ident">TY</span>, <span class="ident">PRIV</span>, $(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="kw-2">*</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">missing_copy_implementations</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_camel_case_types</span>)]</span>
|
|
|
|
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
|
|
|
|
$(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span>
|
|
|
|
|
<span class="kw">struct</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()}
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">static</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>: <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> {<span class="ident">__private_field</span>: ()};
|
|
|
|
|
($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>:<span class="ident">meta</span>]</span>)<span class="op">*</span> <span class="kw">pub</span> ($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>:<span class="ident">tt</span>)<span class="op">+</span>) <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span>:<span class="ident">ident</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span>:<span class="ident">ty</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>:<span class="ident">expr</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">tt</span>)<span class="kw-2">*</span>) <span class="op">=></span> {
|
|
|
|
|
<span class="macro">__lazy_static_internal</span><span class="macro">!</span>($(<span class="attribute">#[<span class="macro-nonterminal">$</span><span class="macro-nonterminal">attr</span>]</span>)<span class="op">*</span> (<span class="kw">pub</span> ($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">vis</span>)<span class="op">+</span>)) <span class="kw">static</span> <span class="kw-2">ref</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">N</span> : <span class="macro-nonterminal">$</span><span class="macro-nonterminal">T</span> <span class="op">=</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">e</span>; $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)<span class="kw-2">*</span>);
|
|
|
|
|
};
|
|
|
|
|
() <span class="op">=></span> ()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="doccomment">/// Support trait for enabling a few common operation on lazy static values.</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// This is implemented by each defined lazy static, and</span>
|
|
|
|
|
<span class="doccomment">/// used by the free functions in this crate.</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">LazyStatic</span> {
|
|
|
|
|
<span class="attribute">#[<span class="ident">doc</span>(<span class="ident">hidden</span>)]</span>
|
|
|
|
|
<span class="kw">fn</span> <span class="ident">initialize</span>(<span class="ident">lazy</span>: <span class="kw-2">&</span><span class="self">Self</span>);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="doccomment">/// Takes a shared reference to a lazy static and initializes</span>
|
|
|
|
|
<span class="doccomment">/// it if it has not been already.</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// This can be used to control the initialization point of a lazy static.</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// Example:</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// ```rust</span>
|
|
|
|
|
<span class="doccomment">/// #[macro_use]</span>
|
|
|
|
|
<span class="doccomment">/// extern crate lazy_static;</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// lazy_static! {</span>
|
|
|
|
|
<span class="doccomment">/// static ref BUFFER: Vec<u8> = (0..65537).collect();</span>
|
|
|
|
|
<span class="doccomment">/// }</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// fn main() {</span>
|
|
|
|
|
<span class="doccomment">/// lazy_static::initialize(&BUFFER);</span>
|
|
|
|
|
<span class="doccomment">///</span>
|
|
|
|
|
<span class="doccomment">/// // ...</span>
|
|
|
|
|
<span class="doccomment">/// work_with_initialized_data(&BUFFER);</span>
|
|
|
|
|
<span class="doccomment">/// }</span>
|
|
|
|
|
<span class="doccomment">/// # fn work_with_initialized_data(_: &[u8]) {}</span>
|
|
|
|
|
<span class="doccomment">/// ```</span>
|
|
|
|
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">initialize</span><span class="op"><</span><span class="ident">T</span>: <span class="ident">LazyStatic</span><span class="op">></span>(<span class="ident">lazy</span>: <span class="kw-2">&</span><span class="ident">T</span>) {
|
|
|
|
|
<span class="ident">LazyStatic</span>::<span class="ident">initialize</span>(<span class="ident">lazy</span>);
|
|
|
|
|
}
|
|
|
|
|
</pre>
|
|
|
|
|
</section>
|
|
|
|
|
<section id='search' class="content hidden"></section>
|
|
|
|
|
|