Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate libc;
- use libc::{malloc, free, c_void};
- trait Trace {}
- struct MyTrace {
- #[allow(dead_code)]
- buf: *mut c_void,
- }
- impl MyTrace {
- fn new() -> Self {
- Self{buf: unsafe{malloc(128)}}
- }
- }
- impl Trace for MyTrace {}
- impl Drop for MyTrace {
- fn drop(&mut self) {
- unsafe{free(self.buf)};
- }
- }
- trait Tracer {
- fn start(&mut self);
- fn stop(&mut self) -> Box<Trace>;
- }
- struct MyTracer {
- trace: Option<MyTrace>,
- }
- impl MyTracer {
- fn new() -> Self {
- Self{trace: None}
- }
- }
- impl Tracer for MyTracer {
- fn start(&mut self) {
- self.trace = Some(MyTrace::new());
- // Pretend the buffer is mutated in C here...
- }
- fn stop(&mut self) -> Box<Trace> {
- Box::new(self.trace.take().unwrap())
- }
- }
- fn main() {
- let mut tracer = MyTracer::new();
- tracer.start();
- let _trace = tracer.stop();
- println!("Hello, world!");
- }
Add Comment
Please, Sign In to add comment