Expand description
A library for safe cross-platform linker shenanigans.
Platform support
Component | Linux | macOS | Windows | FreeBSD | illumos | Other…† |
---|---|---|---|---|---|---|
Distributed slice | 💚 | 💚 | 💚 | 💚 | 💚 |
† 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();
}