Crate linkme[−][src]
Expand description
A library for safe cross-platform linker shenanigans.
Platform support
| Component | Linux | macOS | Windows | 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();
}Structs
Collection of static elements that are gathered into a contiguous section of the binary by the linker.
