[−][src]Crate linkme
A library for safe cross-platform linker shenanigans.
Platform support
Component | Linux | macOS | Windows | Other...† |
---|---|---|---|---|
Distributed slice | ✅ | ✅ | planned |
† We welcome PRs adding support for any platforms not
listed here.
Distributed slice
A distributed slice is a collection of static elements that are gathered into a contiguous section of the binary by the linker. Slice elements may be defined individually from anywhere in the dependency graph of the final binary.
Refer to linkme::DistributedSlice
for complete details
of the API. The basic idea is as follows.
A static distributed slice is declared by writing #[distributed_slice]
on
a static item whose type is [T]
for some type T
. The initializer
expression must be [..]
to indicate that elements come from elsewhere.
use linkme::distributed_slice; #[distributed_slice] pub static BENCHMARKS: [fn(&mut Bencher)] = [..];
Slice elements may be registered into a distributed slice by a
#[distributed_slice(...)]
attribute in which the path to the distributed
slice is given in the parentheses. The initializer is required to be a const
expression.
use linkme::distributed_slice; use other_crate::BENCHMARKS; #[distributed_slice(BENCHMARKS)] static BENCH_DESERIALIZE: fn(&mut Bencher) = bench_deserialize; fn bench_deserialize(b: &mut Bencher) { /* ... */ }
The distributed slice behaves in all ways like &'static [T]
.
fn main() { // Iterate the elements. for bench in BENCHMARKS { /* ... */ } // Index into the elements. let first = BENCHMARKS[0]; // Slice the elements. let except_first = &BENCHMARKS[1..]; // Invoke methods on the underlying slice. let len = BENCHMARKS.len(); }
Structs
DistributedSlice | Collection of static elements that are gathered into a contiguous section of the binary by the linker. |