add some From Impls

This commit is contained in:
2022-09-10 19:57:58 +02:00
parent 65c423bdd2
commit f87ff7523f
2 changed files with 75 additions and 61 deletions

View File

@ -1,54 +1,55 @@
use std::sync::{Arc, Mutex};
trait ProvidesFoo {
fn magic(&mut self);
}
struct Foo {
magic_value: u32
}
impl Default for Foo {
fn default() -> Self {
Self {magic_value: 42}
}
}
impl ProvidesFoo for Foo {
fn magic(&mut self) {
println!("ProvidesFoo magic");
}
}
pub type SharedFooConcrete = Arc<Mutex<Box<Foo>>>;
pub type SharedFooTraitObj = Arc<Mutex<Box<dyn ProvidesFoo + Send + Sync>>>;
struct FooProvider {
foo_as_trait_obj: SharedFooTraitObj
}
impl FooProvider {
fn magic_and_then_some(&mut self) {
let mut fooguard = self.foo_as_trait_obj.lock().unwrap();
fooguard.magic();
println!("Additional magic");
}
}
fn uses_shared_foo_boxed_trait_obj(foo: SharedFooTraitObj) {
let mut foo_provider = FooProvider {
foo_as_trait_obj: foo
};
foo_provider.magic_and_then_some();
}
fn uses_shared_foo_concrete(foo: SharedFooConcrete) {
let mut fooguard = foo.lock().unwrap();
fooguard.magic();
}
// use std::sync::{Arc, Mutex};
//
// trait ProvidesFoo {
// fn magic(&mut self);
// }
//
// struct Foo {
// magic_value: u32,
// }
//
// impl Default for Foo {
// fn default() -> Self {
// Self { magic_value: 42 }
// }
// }
//
// impl ProvidesFoo for Foo {
// fn magic(&mut self) {
// println!("ProvidesFoo magic {}", self.magic_value);
// }
// }
//
// type SharedFooConcrete = Arc<Mutex<Box<Foo>>>;
// type SharedFooTraitObj = Arc<Mutex<Box<dyn ProvidesFoo + Send + Sync>>>;
//
// #[allow(dead_code)]
// struct FooProvider {
// foo_as_trait_obj: SharedFooTraitObj,
// }
//
// impl FooProvider {
// fn magic_and_then_some(&mut self) {
// let mut fooguard = self.foo_as_trait_obj.lock().unwrap();
// fooguard.magic();
// println!("Additional magic");
// }
// }
//
// #[allow(dead_code)]
// fn uses_shared_foo_boxed_trait_obj(foo: SharedFooTraitObj) {
// let mut foo_provider = FooProvider {
// foo_as_trait_obj: foo,
// };
// foo_provider.magic_and_then_some();
// }
// fn uses_shared_foo_concrete(foo: SharedFooConcrete) {
// let mut fooguard = foo.lock().unwrap();
// fooguard.magic();
// }
//
fn main() {
let shared_foo = Arc::new(Mutex::new(Box::new(Foo::default())));
uses_shared_foo_concrete(shared_foo.clone());
uses_shared_foo_boxed_trait_obj(shared_foo);
// let shared_foo = Arc::new(Mutex::new(Box::new(Foo::default())));
// uses_shared_foo_concrete(shared_foo.clone());
// // uses_shared_foo_boxed_trait_obj(shared_foo);
}