Guest User

Untitled

a guest
Jul 17th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. use std::marker::PhantomData;
  2. use std::ptr;
  3. use std::os::raw::c_void;
  4. use std::mem::transmute;
  5.  
  6. unsafe extern "C" fn connect<T>(user_data: *const c_void, func: *const c_void) {
  7. let f: &&(Fn(&mut T) + 'static) = transmute(func);
  8. let data = user_data as *mut T;
  9. f(&mut *data);
  10. }
  11.  
  12. #[derive(Default, Debug, Clone)]
  13. struct Widget<'a> {
  14. size: (u32, u32),
  15. _marker: PhantomData<&'a Rute<'a>>,
  16. }
  17.  
  18. impl<'a> Widget<'a> {
  19. pub fn size(mut self, width: u32, height: u32) -> Widget<'a> {
  20. self.size = (width, height);
  21. self
  22. }
  23.  
  24. pub fn on_change<'b: 'a, F, T>(self, data: &'b mut T, func: F) -> Widget<'a>
  25. where
  26. F: Fn(&mut T) + 'static
  27. {
  28. unsafe {
  29. let f: Box<Box<Fn(&mut T) + 'static>> = Box::new(Box::new(func));
  30. let user_data: *const c_void = transmute(data);
  31. connect::<T>(user_data, Box::into_raw(f) as *const c_void);
  32. }
  33.  
  34. self
  35. }
  36. }
  37.  
  38. struct CRute;
  39.  
  40. struct Rute<'a> {
  41. _rute_ffi: *const CRute,
  42. _marker: PhantomData<&'a CRute>,
  43. }
  44.  
  45. impl<'a> Rute<'a> {
  46. pub fn new() -> Rute<'a> {
  47. Rute {
  48. _rute_ffi: ptr::null(),
  49. _marker: PhantomData,
  50. }
  51. }
  52.  
  53. pub fn create_widget(&self) -> Widget {
  54. // NOTE: this will actually call some FFI stuff here
  55. Widget::default()
  56. }
  57. }
  58.  
  59. struct MyApp<'a> {
  60. rute: &'a Rute<'a>,
  61. some_text: String,
  62. }
  63.  
  64. impl<'a> MyApp<'a> {
  65. pub fn new(rute: &'a Rute<'a>) -> MyApp<'a> {
  66. let my_app = MyApp {
  67. rute: rute,
  68. some_text: "Foo".to_owned(),
  69. };
  70.  
  71. my_app
  72. }
  73.  
  74. pub fn setup_ui(&mut self) {
  75. self.rute.create_widget()
  76. .size(100, 200)
  77. .on_change(self, |data| {
  78. println!("callback {}", data.some_text);
  79. data.some_text = "Sometext".to_owned()
  80. });
  81. }
  82. }
  83.  
  84. fn main() {
  85. let rute = Rute::new();
  86. let mut app = MyApp::new(&rute);
  87.  
  88. app.setup_ui();
  89.  
  90. println!("{}", app.some_text)
  91. }
Add Comment
Please, Sign In to add comment