# 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"
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"
-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>());
}
-