mirror of
https://github.com/denoland/rusty_v8.git
synced 2025-02-08 07:16:31 -05:00
wip
This commit is contained in:
parent
16e82f13a0
commit
1b61d2c4da
1 changed files with 77 additions and 47 deletions
124
src/main.rs
124
src/main.rs
|
@ -46,16 +46,42 @@ mod channel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ChannelOverrides {
|
pub trait ChannelOverrides: AsChannel {
|
||||||
fn extender(&self) -> &ChannelExtender;
|
fn extender(&self) -> &ChannelExtender;
|
||||||
fn extender_mut(&mut self) -> &mut ChannelExtender;
|
fn extender_mut(&mut self) -> &mut ChannelExtender;
|
||||||
|
|
||||||
fn method1(&mut self) {
|
fn method1(&mut self) {
|
||||||
ChannelDefaults::method1(self.extender_mut())
|
ChannelDefaults::method1(self.extender_mut().as_mut())
|
||||||
}
|
}
|
||||||
fn method2(&self) -> i32;
|
fn method2(&self) -> i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait AsChannel {
|
||||||
|
fn as_channel(&self) -> &Channel;
|
||||||
|
fn as_channel_mut(&mut self) -> &mut Channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AsChannel for ChannelExtender {
|
||||||
|
fn as_channel(&self) -> &Channel {
|
||||||
|
&self.cxx_channel
|
||||||
|
}
|
||||||
|
fn as_channel_mut(&mut self) -> &mut Channel {
|
||||||
|
&mut self.cxx_channel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> AsChannel for T
|
||||||
|
where
|
||||||
|
T: ChannelOverrides,
|
||||||
|
{
|
||||||
|
fn as_channel(&self) -> &Channel {
|
||||||
|
&self.extender().cxx_channel
|
||||||
|
}
|
||||||
|
fn as_channel_mut(&mut self) -> &mut Channel {
|
||||||
|
&mut self.extender_mut().cxx_channel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ChannelExtender {
|
pub struct ChannelExtender {
|
||||||
cxx_channel: Channel,
|
cxx_channel: Channel,
|
||||||
extender_offset: usize,
|
extender_offset: usize,
|
||||||
|
@ -143,58 +169,19 @@ mod channel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::ops::Deref for ChannelExtender {
|
impl std::convert::AsRef<Channel> for ChannelExtender {
|
||||||
type Target = Channel;
|
fn as_ref(&self) -> &Channel {
|
||||||
fn deref(&self) -> &Channel {
|
|
||||||
&self.cxx_channel
|
&self.cxx_channel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::ops::DerefMut for ChannelExtender {
|
impl std::convert::AsMut<Channel> for ChannelExtender {
|
||||||
fn deref_mut(&mut self) -> &mut Channel {
|
fn as_mut(&mut self) -> &mut Channel {
|
||||||
&mut self.cxx_channel
|
&mut self.cxx_channel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod trying {
|
|
||||||
use super::channel::*;
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub struct Session {
|
|
||||||
a: i32,
|
|
||||||
channel_extender: ChannelExtender,
|
|
||||||
b: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ChannelOverrides for Session {
|
|
||||||
fn extender(&self) -> &ChannelExtender {
|
|
||||||
&self.channel_extender
|
|
||||||
}
|
|
||||||
fn extender_mut(&mut self) -> &mut ChannelExtender {
|
|
||||||
&mut self.channel_extender
|
|
||||||
}
|
|
||||||
fn method1(&mut self) {
|
|
||||||
println!("overriden a() called");
|
|
||||||
self.a += self.b;
|
|
||||||
}
|
|
||||||
fn method2(&self) -> i32 {
|
|
||||||
println!("overriden b() called");
|
|
||||||
self.a * self.b
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Session {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {
|
|
||||||
channel_extender: ChannelExtender::new::<Self>(),
|
|
||||||
a: 2,
|
|
||||||
b: 3,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mod util {
|
mod util {
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
|
@ -249,6 +236,49 @@ mod util {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
mod example {
|
||||||
trying::Session::new();
|
use super::channel::*;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub struct Example {
|
||||||
|
a: i32,
|
||||||
|
channel_extender: ChannelExtender,
|
||||||
|
b: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChannelOverrides for Example {
|
||||||
|
fn extender(&self) -> &ChannelExtender {
|
||||||
|
&self.channel_extender
|
||||||
|
}
|
||||||
|
fn extender_mut(&mut self) -> &mut ChannelExtender {
|
||||||
|
&mut self.channel_extender
|
||||||
|
}
|
||||||
|
fn method1(&mut self) {
|
||||||
|
println!("overriden a() called");
|
||||||
|
self.a += self.b;
|
||||||
|
}
|
||||||
|
fn method2(&self) -> i32 {
|
||||||
|
println!("overriden b() called");
|
||||||
|
self.a * self.b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Example {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
channel_extender: ChannelExtender::new::<Self>(),
|
||||||
|
a: 2,
|
||||||
|
b: 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
use channel::*;
|
||||||
|
use example::*;
|
||||||
|
let mut ex = Example::new();
|
||||||
|
let chan = ex.as_channel_mut();
|
||||||
|
chan.method1();
|
||||||
|
println!("{}", chan.method2());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue