chiark / gitweb /
T
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 16 Aug 2023 15:07:06 +0000 (16:07 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 16 Aug 2023 15:07:06 +0000 (16:07 +0100)
Cargo.lock
Cargo.toml
src/main.rs

index 01857a50eb72388b776161c4b514b59e586b105b..23b316533f870413be9b20169c99614de57cfb4c 100644 (file)
@@ -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"
index f90fd2a1f0af91d91930a82f2eec25a1da14e5d6..d4b15f49ee515d6e92f13add3d8dd7b9759802d9 100644 (file)
@@ -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"] }
index 9123ceafad0883bef50f9642518bc5416e0b01d9..9ce70ab69b071f0fe884287da020cc5457da76ec 100644 (file)
@@ -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: 'static>(_: X) { }
-            let _ = |x: Box<dyn HasFeet + '_>| 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<T:?Sized+'static>(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::<dyn HasFeet>(),
-        TypeId::of::<
-fn (&dyn HasPseudoMethods) -> &(dyn HasFeet + 'static)
-         >());
-    dbg!(
-        TypeId::of::<T>(),
-        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<dyn HasPseudoMethods> = 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::<dyn HasFeet>(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<oneshot::Receiver<Void>>;
+    println!("{:?}", std::alloc::Layout::new::<F>());
 }
-