pub trait Using: Sync {
type Item: 'static;
fn create(&self, thread_idx: usize) -> Self::Item;
fn into_inner(self) -> Self::Item;
}
pub struct UsingClone<T: Clone + 'static>(T);
impl<T: Clone + 'static> UsingClone<T> {
pub(crate) fn new(value: T) -> Self {
Self(value)
}
}
impl<T: Clone + 'static> Using for UsingClone<T> {
type Item = T;
fn create(&self, _: usize) -> T {
self.0.clone()
}
fn into_inner(self) -> Self::Item {
self.0
}
}
unsafe impl<T: Clone + 'static> Sync for UsingClone<T> {}
pub struct UsingFun<F, T>
where
T: 'static,
F: Fn(usize) -> T + Sync,
{
fun: F,
}
impl<F, T> UsingFun<F, T>
where
T: 'static,
F: Fn(usize) -> T + Sync,
{
pub(crate) fn new(fun: F) -> Self {
Self { fun }
}
}
impl<F, T> Using for UsingFun<F, T>
where
T: 'static,
F: Fn(usize) -> T + Sync,
{
type Item = T;
fn create(&self, thread_idx: usize) -> Self::Item {
(self.fun)(thread_idx)
}
fn into_inner(self) -> Self::Item {
(self.fun)(0)
}
}