From: Ian Jackson Date: Wed, 16 Aug 2023 15:07:06 +0000 (+0100) Subject: T X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=3389a3ffce0d002594dbb0662a8fe6294680cece;p=rust-experiments.git T --- diff --git a/Cargo.lock b/Cargo.lock index 01857a5..23b3165 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "downcast-rs" version = "1.2.0" @@ -13,4 +19,156 @@ name = "foo" version = "0.1.0" dependencies = [ "downcast-rs", + "futures", +] + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "pin-project-lite" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "syn" +version = "2.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" diff --git a/Cargo.toml b/Cargo.toml index f90fd2a..d4b15f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] downcast-rs = "1" +futures = "0.3.28" #tokio = { version = "1", features = ["full"] } #serde-value = "0.7" #serde = { version="1", features=["derive"] } diff --git a/src/main.rs b/src/main.rs index 9123cea..9ce70ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,108 +1,8 @@ -use std::any::{Any, TypeId}; -use std::sync::Arc; - -use downcast_rs::{impl_downcast, Downcast, DowncastSync}; - -pub trait HasPseudoMethods: DowncastSync { - fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any>; -} -impl_downcast!(sync HasPseudoMethods); - -trait HasFeet: 'static { - fn how_many_feet(&self) -> usize; -} - -struct Frog; - -impl HasFeet for Frog { - fn how_many_feet(&self) -> usize { - 4 - } -} - -impl HasPseudoMethods for Frog { - // Note: if you wanted to be able to add more traits to Frog elsewhere, you would - // need a registry of cast-to-trait objects, similar to the existing dispatch - // table. I'm not sure if that's needed. - fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any> { - if tp == TypeId::of::<&'static dyn HasFeet>() { - fn assert_static(_: X) { } - let _ = |x: Box| assert_static(x); - static CASTER: fn(&dyn HasPseudoMethods) -> &dyn HasFeet = |self_| { - let self_: &dyn Any = Downcast::as_any(self_); - let self_: &Frog = self_.downcast_ref().unwrap(); - let self_: &dyn HasFeet = self_ as _; - self_ - }; - - return Some(&CASTER); - } - None - } -} - - -fn cast1(inp: &dyn HasPseudoMethods) -> Option<&dyn HasFeet> { - dbg!(std::any::type_name::<&'static dyn HasFeet>()); - let caster: &'static dyn Any = inp.get_caster(TypeId::of::<&'static dyn HasFeet>())?; - let caster: &'static fn (&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap(); - let with_feet = caster(inp); - Some(with_feet) -} - - -fn cast2(inp: &dyn HasPseudoMethods) -> Option<&T> { - dbg!(std::any::type_name::<&'static T>()); - let caster: &'static dyn Any = inp.get_caster(TypeId::of::<&'static T>())?; - - let caster_f: &'static fn (&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap(); - dbg!(caster, caster_f); - - dbg!( - TypeId::of::(), - TypeId::of::< -fn (&dyn HasPseudoMethods) -> &(dyn HasFeet + 'static) - >()); - dbg!( - TypeId::of::(), - TypeId::of::< -fn (&dyn HasPseudoMethods) -> &T - >()); - - let caster: &'static fn (&dyn HasPseudoMethods) -> &T = - caster.downcast_ref -//::< -// for <'x> fn (&'x dyn HasPseudoMethods) -> &'x T -// > -().unwrap(); - let with_feet = caster(inp); - Some(with_feet) -} +use futures::channel::oneshot; +enum Void {} fn main() { - let frog = Arc::new(Frog); - let erased_frog: Arc = frog as _; -/* - let erased_frog: &dyn HasPseudoMethods = &*erased_frog; - - let caster: &'static dyn Any = erased_frog - .get_caster(TypeId::of::<&'static dyn HasFeet>()) - .unwrap(); - - let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap(); - - let with_feet: &dyn HasFeet = caster(erased_frog); -*/ - // THIS WORKS. - let with_feet: &dyn HasFeet = cast1(erased_frog.as_ref()).unwrap(); - // THIS CRASHES. - let with_feet: &dyn HasFeet = cast2::(erased_frog.as_ref()).unwrap(); - - println!( - "A frog has {} feet and eats .", - with_feet.how_many_feet(), /* - eats_food.favorite_food()*/ - ) + type F = futures::future::Shared>; + println!("{:?}", std::alloc::Layout::new::()); } -