3 releases
0.1.2 | Dec 12, 2022 |
---|---|
0.1.1 | Dec 12, 2022 |
0.1.0 | Dec 11, 2022 |
#1574 in Data structures
20KB
430 lines
simple-ref-fn
Type-erased function wrappers that do not require virtual tables.
lib.rs
:
This crate provides type-erased function wrappers that behave like &dyn Fn(T) -> R
and &mut dyn FnMut(T) -> R
,
but do not require compiler to generate virtual tables.
The following wrapper types are provided:
Type | Behaves like | Send |
Sync |
---|---|---|---|
RefFn<'a, T, R> |
&'a dyn Fn(T) -> R |
No | No |
RefSyncFn<'a, T, R> |
&'a (dyn Fn(T) -> R + Sync) |
Yes | Yes |
RefFnMut<'a, T, R> |
&'a mut dyn FnMut(T) -> R |
No | Yes |
RefSendFnMut<'a, T, R> |
&'a mut (dyn FnMut(T) -> R + Send) |
Yes | Yes |
Examples
Bind a function with a reference
use simple_ref_fn::{RefFn, StaticRefFunction};
// Define a static function.
struct F;
impl StaticRefFunction<'_, u32, u32> for F {
type Output = u32;
fn call(data: &u32, arg: u32) -> Self::Output {
data + arg
}
}
// Bind the function with a reference.
let data = 2;
let f: RefFn<u32, u32> = F::bind(&data); // Type-erasure.
assert_eq!(f.call(3), 5);
assert_eq!(f.call(5), 7);
assert_eq!(f.call(7), 9);
Erase the type of a closure
use simple_ref_fn::RefFn;
let data = 2_u32;
let closure = |arg: u32| data + arg;
let f: RefFn<u32, u32> = RefFn::from(&closure); // Type-erasure.
assert_eq!(f.call(3), 5);
assert_eq!(f.call(5), 7);
assert_eq!(f.call(7), 9);