Skip to content

Instantly share code, notes, and snippets.

@SiegeLord
Created April 14, 2013 04:02
Show Gist options
  • Save SiegeLord/5381409 to your computer and use it in GitHub Desktop.
Save SiegeLord/5381409 to your computer and use it in GitHub Desktop.
C callbacks
use core::libc::*;
extern "C"
{
fn c_func(cb : extern "C" fn(data : *mut c_void), data : *mut c_void);
}
fn rust_func<T>(cb : &fn(data : &T), data : &T)
{
unsafe
{
struct RustData<'self, T>
{
Callback : &'self fn(data : &T);
Data : &'self T;
}
extern "C"
fn RustCallback<T>(data : *mut c_void)
{
let rust_data : &mut RustData<T> = cast::transmute(data);
(rust_data.Callback)(rust_data.Data);
}
let mut rust_data = RustData{Callback : cb, Data : data};
c_func(cast::transmute(RustCallback), cast::transmute(&rust_data));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment