Warning, /sdk/rust-qt-binding-generator/demo/rust/src/interface.rs is written in an unsupported language. File is not indexed.

0001 /* generated by rust_qt_binding_generator */
0002 use libc::{c_char, c_ushort, c_int};
0003 use std::slice;
0004 use std::char::decode_utf16;
0005 
0006 use std::sync::Arc;
0007 use std::sync::atomic::{AtomicPtr, Ordering};
0008 use std::ptr::null;
0009 
0010 use implementation::*;
0011 
0012 
0013 #[repr(C)]
0014 pub struct COption<T> {
0015     data: T,
0016     some: bool,
0017 }
0018 
0019 impl<T> COption<T> {
0020     #![allow(dead_code)]
0021     fn into(self) -> Option<T> {
0022         if self.some {
0023             Some(self.data)
0024         } else {
0025             None
0026         }
0027     }
0028 }
0029 
0030 impl<T> From<Option<T>> for COption<T>
0031 where
0032     T: Default,
0033 {
0034     fn from(t: Option<T>) -> COption<T> {
0035         if let Some(v) = t {
0036             COption {
0037                 data: v,
0038                 some: true,
0039             }
0040         } else {
0041             COption {
0042                 data: T::default(),
0043                 some: false,
0044             }
0045         }
0046     }
0047 }
0048 
0049 
0050 pub enum QString {}
0051 
0052 fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) {
0053     let utf16 = unsafe { slice::from_raw_parts(str, to_usize(len)) };
0054     let characters = decode_utf16(utf16.iter().cloned())
0055         .map(|r| r.unwrap());
0056     s.clear();
0057     s.extend(characters);
0058 }
0059 
0060 
0061 
0062 pub enum QByteArray {}
0063 
0064 
0065 #[repr(C)]
0066 #[derive(PartialEq, Eq, Debug)]
0067 pub enum SortOrder {
0068     Ascending = 0,
0069     Descending = 1,
0070 }
0071 
0072 #[repr(C)]
0073 pub struct QModelIndex {
0074     row: c_int,
0075     internal_id: usize,
0076 }
0077 
0078 
0079 fn to_usize(n: c_int) -> usize {
0080     if n < 0 {
0081         panic!("Cannot cast {} to usize", n);
0082     }
0083     n as usize
0084 }
0085 
0086 
0087 fn to_c_int(n: usize) -> c_int {
0088     if n > c_int::max_value() as usize {
0089         panic!("Cannot cast {} to c_int", n);
0090     }
0091     n as c_int
0092 }
0093 
0094 
0095 pub struct DemoQObject {}
0096 
0097 pub struct DemoEmitter {
0098     qobject: Arc<AtomicPtr<DemoQObject>>,
0099 }
0100 
0101 unsafe impl Send for DemoEmitter {}
0102 
0103 impl DemoEmitter {
0104     /// Clone the emitter
0105     ///
0106     /// The emitter can only be cloned when it is mutable. The emitter calls
0107     /// into C++ code which may call into Rust again. If emmitting is possible
0108     /// from immutable structures, that might lead to access to a mutable
0109     /// reference. That is undefined behaviour and forbidden.
0110     pub fn clone(&mut self) -> DemoEmitter {
0111         DemoEmitter {
0112             qobject: self.qobject.clone(),
0113         }
0114     }
0115     fn clear(&self) {
0116         let n: *const DemoQObject = null();
0117         self.qobject.store(n as *mut DemoQObject, Ordering::SeqCst);
0118     }
0119 }
0120 
0121 pub trait DemoTrait {
0122     fn new(emit: DemoEmitter,
0123         fibonacci: Fibonacci,
0124         fibonacci_list: FibonacciList,
0125         file_system_tree: FileSystemTree,
0126         processes: Processes,
0127         time_series: TimeSeries) -> Self;
0128     fn emit(&mut self) -> &mut DemoEmitter;
0129     fn fibonacci(&self) -> &Fibonacci;
0130     fn fibonacci_mut(&mut self) -> &mut Fibonacci;
0131     fn fibonacci_list(&self) -> &FibonacciList;
0132     fn fibonacci_list_mut(&mut self) -> &mut FibonacciList;
0133     fn file_system_tree(&self) -> &FileSystemTree;
0134     fn file_system_tree_mut(&mut self) -> &mut FileSystemTree;
0135     fn processes(&self) -> &Processes;
0136     fn processes_mut(&mut self) -> &mut Processes;
0137     fn time_series(&self) -> &TimeSeries;
0138     fn time_series_mut(&mut self) -> &mut TimeSeries;
0139 }
0140 
0141 #[no_mangle]
0142 pub extern "C" fn demo_new(
0143     demo: *mut DemoQObject,
0144     fibonacci: *mut FibonacciQObject,
0145     fibonacci_input_changed: extern fn(*mut FibonacciQObject),
0146     fibonacci_result_changed: extern fn(*mut FibonacciQObject),
0147     fibonacci_list: *mut FibonacciListQObject,
0148     fibonacci_list_new_data_ready: extern fn(*mut FibonacciListQObject),
0149     fibonacci_list_layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0150     fibonacci_list_layout_changed: extern fn(*mut FibonacciListQObject),
0151     fibonacci_list_data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0152     fibonacci_list_begin_reset_model: extern fn(*mut FibonacciListQObject),
0153     fibonacci_list_end_reset_model: extern fn(*mut FibonacciListQObject),
0154     fibonacci_list_begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0155     fibonacci_list_end_insert_rows: extern fn(*mut FibonacciListQObject),
0156     fibonacci_list_begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0157     fibonacci_list_end_move_rows: extern fn(*mut FibonacciListQObject),
0158     fibonacci_list_begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0159     fibonacci_list_end_remove_rows: extern fn(*mut FibonacciListQObject),
0160     file_system_tree: *mut FileSystemTreeQObject,
0161     file_system_tree_path_changed: extern fn(*mut FileSystemTreeQObject),
0162     file_system_tree_new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0163     file_system_tree_layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0164     file_system_tree_layout_changed: extern fn(*mut FileSystemTreeQObject),
0165     file_system_tree_data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0166     file_system_tree_begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0167     file_system_tree_end_reset_model: extern fn(*mut FileSystemTreeQObject),
0168     file_system_tree_begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0169     file_system_tree_end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0170     file_system_tree_begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0171     file_system_tree_end_move_rows: extern fn(*mut FileSystemTreeQObject),
0172     file_system_tree_begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0173     file_system_tree_end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0174     processes: *mut ProcessesQObject,
0175     processes_active_changed: extern fn(*mut ProcessesQObject),
0176     processes_new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
0177     processes_layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
0178     processes_layout_changed: extern fn(*mut ProcessesQObject),
0179     processes_data_changed: extern fn(*mut ProcessesQObject, usize, usize),
0180     processes_begin_reset_model: extern fn(*mut ProcessesQObject),
0181     processes_end_reset_model: extern fn(*mut ProcessesQObject),
0182     processes_begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0183     processes_end_insert_rows: extern fn(*mut ProcessesQObject),
0184     processes_begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0185     processes_end_move_rows: extern fn(*mut ProcessesQObject),
0186     processes_begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0187     processes_end_remove_rows: extern fn(*mut ProcessesQObject),
0188     time_series: *mut TimeSeriesQObject,
0189     time_series_new_data_ready: extern fn(*mut TimeSeriesQObject),
0190     time_series_layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
0191     time_series_layout_changed: extern fn(*mut TimeSeriesQObject),
0192     time_series_data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
0193     time_series_begin_reset_model: extern fn(*mut TimeSeriesQObject),
0194     time_series_end_reset_model: extern fn(*mut TimeSeriesQObject),
0195     time_series_begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
0196     time_series_end_insert_rows: extern fn(*mut TimeSeriesQObject),
0197     time_series_begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
0198     time_series_end_move_rows: extern fn(*mut TimeSeriesQObject),
0199     time_series_begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
0200     time_series_end_remove_rows: extern fn(*mut TimeSeriesQObject),
0201 ) -> *mut Demo {
0202     let fibonacci_emit = FibonacciEmitter {
0203         qobject: Arc::new(AtomicPtr::new(fibonacci)),
0204         input_changed: fibonacci_input_changed,
0205         result_changed: fibonacci_result_changed,
0206     };
0207     let d_fibonacci = Fibonacci::new(fibonacci_emit);
0208     let fibonacci_list_emit = FibonacciListEmitter {
0209         qobject: Arc::new(AtomicPtr::new(fibonacci_list)),
0210         new_data_ready: fibonacci_list_new_data_ready,
0211     };
0212     let model = FibonacciListList {
0213         qobject: fibonacci_list,
0214         layout_about_to_be_changed: fibonacci_list_layout_about_to_be_changed,
0215         layout_changed: fibonacci_list_layout_changed,
0216         data_changed: fibonacci_list_data_changed,
0217         begin_reset_model: fibonacci_list_begin_reset_model,
0218         end_reset_model: fibonacci_list_end_reset_model,
0219         begin_insert_rows: fibonacci_list_begin_insert_rows,
0220         end_insert_rows: fibonacci_list_end_insert_rows,
0221         begin_move_rows: fibonacci_list_begin_move_rows,
0222         end_move_rows: fibonacci_list_end_move_rows,
0223         begin_remove_rows: fibonacci_list_begin_remove_rows,
0224         end_remove_rows: fibonacci_list_end_remove_rows,
0225     };
0226     let d_fibonacci_list = FibonacciList::new(fibonacci_list_emit, model);
0227     let file_system_tree_emit = FileSystemTreeEmitter {
0228         qobject: Arc::new(AtomicPtr::new(file_system_tree)),
0229         path_changed: file_system_tree_path_changed,
0230         new_data_ready: file_system_tree_new_data_ready,
0231     };
0232     let model = FileSystemTreeTree {
0233         qobject: file_system_tree,
0234         layout_about_to_be_changed: file_system_tree_layout_about_to_be_changed,
0235         layout_changed: file_system_tree_layout_changed,
0236         data_changed: file_system_tree_data_changed,
0237         begin_reset_model: file_system_tree_begin_reset_model,
0238         end_reset_model: file_system_tree_end_reset_model,
0239         begin_insert_rows: file_system_tree_begin_insert_rows,
0240         end_insert_rows: file_system_tree_end_insert_rows,
0241         begin_move_rows: file_system_tree_begin_move_rows,
0242         end_move_rows: file_system_tree_end_move_rows,
0243         begin_remove_rows: file_system_tree_begin_remove_rows,
0244         end_remove_rows: file_system_tree_end_remove_rows,
0245     };
0246     let d_file_system_tree = FileSystemTree::new(file_system_tree_emit, model);
0247     let processes_emit = ProcessesEmitter {
0248         qobject: Arc::new(AtomicPtr::new(processes)),
0249         active_changed: processes_active_changed,
0250         new_data_ready: processes_new_data_ready,
0251     };
0252     let model = ProcessesTree {
0253         qobject: processes,
0254         layout_about_to_be_changed: processes_layout_about_to_be_changed,
0255         layout_changed: processes_layout_changed,
0256         data_changed: processes_data_changed,
0257         begin_reset_model: processes_begin_reset_model,
0258         end_reset_model: processes_end_reset_model,
0259         begin_insert_rows: processes_begin_insert_rows,
0260         end_insert_rows: processes_end_insert_rows,
0261         begin_move_rows: processes_begin_move_rows,
0262         end_move_rows: processes_end_move_rows,
0263         begin_remove_rows: processes_begin_remove_rows,
0264         end_remove_rows: processes_end_remove_rows,
0265     };
0266     let d_processes = Processes::new(processes_emit, model);
0267     let time_series_emit = TimeSeriesEmitter {
0268         qobject: Arc::new(AtomicPtr::new(time_series)),
0269         new_data_ready: time_series_new_data_ready,
0270     };
0271     let model = TimeSeriesList {
0272         qobject: time_series,
0273         layout_about_to_be_changed: time_series_layout_about_to_be_changed,
0274         layout_changed: time_series_layout_changed,
0275         data_changed: time_series_data_changed,
0276         begin_reset_model: time_series_begin_reset_model,
0277         end_reset_model: time_series_end_reset_model,
0278         begin_insert_rows: time_series_begin_insert_rows,
0279         end_insert_rows: time_series_end_insert_rows,
0280         begin_move_rows: time_series_begin_move_rows,
0281         end_move_rows: time_series_end_move_rows,
0282         begin_remove_rows: time_series_begin_remove_rows,
0283         end_remove_rows: time_series_end_remove_rows,
0284     };
0285     let d_time_series = TimeSeries::new(time_series_emit, model);
0286     let demo_emit = DemoEmitter {
0287         qobject: Arc::new(AtomicPtr::new(demo)),
0288     };
0289     let d_demo = Demo::new(demo_emit,
0290         d_fibonacci,
0291         d_fibonacci_list,
0292         d_file_system_tree,
0293         d_processes,
0294         d_time_series);
0295     Box::into_raw(Box::new(d_demo))
0296 }
0297 
0298 #[no_mangle]
0299 pub unsafe extern "C" fn demo_free(ptr: *mut Demo) {
0300     Box::from_raw(ptr).emit().clear();
0301 }
0302 
0303 #[no_mangle]
0304 pub unsafe extern "C" fn demo_fibonacci_get(ptr: *mut Demo) -> *mut Fibonacci {
0305     (&mut *ptr).fibonacci_mut()
0306 }
0307 
0308 #[no_mangle]
0309 pub unsafe extern "C" fn demo_fibonacci_list_get(ptr: *mut Demo) -> *mut FibonacciList {
0310     (&mut *ptr).fibonacci_list_mut()
0311 }
0312 
0313 #[no_mangle]
0314 pub unsafe extern "C" fn demo_file_system_tree_get(ptr: *mut Demo) -> *mut FileSystemTree {
0315     (&mut *ptr).file_system_tree_mut()
0316 }
0317 
0318 #[no_mangle]
0319 pub unsafe extern "C" fn demo_processes_get(ptr: *mut Demo) -> *mut Processes {
0320     (&mut *ptr).processes_mut()
0321 }
0322 
0323 #[no_mangle]
0324 pub unsafe extern "C" fn demo_time_series_get(ptr: *mut Demo) -> *mut TimeSeries {
0325     (&mut *ptr).time_series_mut()
0326 }
0327 
0328 pub struct FibonacciQObject {}
0329 
0330 pub struct FibonacciEmitter {
0331     qobject: Arc<AtomicPtr<FibonacciQObject>>,
0332     input_changed: extern fn(*mut FibonacciQObject),
0333     result_changed: extern fn(*mut FibonacciQObject),
0334 }
0335 
0336 unsafe impl Send for FibonacciEmitter {}
0337 
0338 impl FibonacciEmitter {
0339     /// Clone the emitter
0340     ///
0341     /// The emitter can only be cloned when it is mutable. The emitter calls
0342     /// into C++ code which may call into Rust again. If emmitting is possible
0343     /// from immutable structures, that might lead to access to a mutable
0344     /// reference. That is undefined behaviour and forbidden.
0345     pub fn clone(&mut self) -> FibonacciEmitter {
0346         FibonacciEmitter {
0347             qobject: self.qobject.clone(),
0348             input_changed: self.input_changed,
0349             result_changed: self.result_changed,
0350         }
0351     }
0352     fn clear(&self) {
0353         let n: *const FibonacciQObject = null();
0354         self.qobject.store(n as *mut FibonacciQObject, Ordering::SeqCst);
0355     }
0356     pub fn input_changed(&mut self) {
0357         let ptr = self.qobject.load(Ordering::SeqCst);
0358         if !ptr.is_null() {
0359             (self.input_changed)(ptr);
0360         }
0361     }
0362     pub fn result_changed(&mut self) {
0363         let ptr = self.qobject.load(Ordering::SeqCst);
0364         if !ptr.is_null() {
0365             (self.result_changed)(ptr);
0366         }
0367     }
0368 }
0369 
0370 pub trait FibonacciTrait {
0371     fn new(emit: FibonacciEmitter) -> Self;
0372     fn emit(&mut self) -> &mut FibonacciEmitter;
0373     fn input(&self) -> u32;
0374     fn set_input(&mut self, value: u32);
0375     fn result(&self) -> u64;
0376 }
0377 
0378 #[no_mangle]
0379 pub extern "C" fn fibonacci_new(
0380     fibonacci: *mut FibonacciQObject,
0381     fibonacci_input_changed: extern fn(*mut FibonacciQObject),
0382     fibonacci_result_changed: extern fn(*mut FibonacciQObject),
0383 ) -> *mut Fibonacci {
0384     let fibonacci_emit = FibonacciEmitter {
0385         qobject: Arc::new(AtomicPtr::new(fibonacci)),
0386         input_changed: fibonacci_input_changed,
0387         result_changed: fibonacci_result_changed,
0388     };
0389     let d_fibonacci = Fibonacci::new(fibonacci_emit);
0390     Box::into_raw(Box::new(d_fibonacci))
0391 }
0392 
0393 #[no_mangle]
0394 pub unsafe extern "C" fn fibonacci_free(ptr: *mut Fibonacci) {
0395     Box::from_raw(ptr).emit().clear();
0396 }
0397 
0398 #[no_mangle]
0399 pub unsafe extern "C" fn fibonacci_input_get(ptr: *const Fibonacci) -> u32 {
0400     (&*ptr).input()
0401 }
0402 
0403 #[no_mangle]
0404 pub unsafe extern "C" fn fibonacci_input_set(ptr: *mut Fibonacci, v: u32) {
0405     (&mut *ptr).set_input(v);
0406 }
0407 
0408 #[no_mangle]
0409 pub unsafe extern "C" fn fibonacci_result_get(ptr: *const Fibonacci) -> u64 {
0410     (&*ptr).result()
0411 }
0412 
0413 pub struct FibonacciListQObject {}
0414 
0415 pub struct FibonacciListEmitter {
0416     qobject: Arc<AtomicPtr<FibonacciListQObject>>,
0417     new_data_ready: extern fn(*mut FibonacciListQObject),
0418 }
0419 
0420 unsafe impl Send for FibonacciListEmitter {}
0421 
0422 impl FibonacciListEmitter {
0423     /// Clone the emitter
0424     ///
0425     /// The emitter can only be cloned when it is mutable. The emitter calls
0426     /// into C++ code which may call into Rust again. If emmitting is possible
0427     /// from immutable structures, that might lead to access to a mutable
0428     /// reference. That is undefined behaviour and forbidden.
0429     pub fn clone(&mut self) -> FibonacciListEmitter {
0430         FibonacciListEmitter {
0431             qobject: self.qobject.clone(),
0432             new_data_ready: self.new_data_ready,
0433         }
0434     }
0435     fn clear(&self) {
0436         let n: *const FibonacciListQObject = null();
0437         self.qobject.store(n as *mut FibonacciListQObject, Ordering::SeqCst);
0438     }
0439     pub fn new_data_ready(&mut self) {
0440         let ptr = self.qobject.load(Ordering::SeqCst);
0441         if !ptr.is_null() {
0442             (self.new_data_ready)(ptr);
0443         }
0444     }
0445 }
0446 
0447 #[derive(Clone)]
0448 pub struct FibonacciListList {
0449     qobject: *mut FibonacciListQObject,
0450     layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0451     layout_changed: extern fn(*mut FibonacciListQObject),
0452     data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0453     begin_reset_model: extern fn(*mut FibonacciListQObject),
0454     end_reset_model: extern fn(*mut FibonacciListQObject),
0455     begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0456     end_insert_rows: extern fn(*mut FibonacciListQObject),
0457     begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0458     end_move_rows: extern fn(*mut FibonacciListQObject),
0459     begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0460     end_remove_rows: extern fn(*mut FibonacciListQObject),
0461 }
0462 
0463 impl FibonacciListList {
0464     pub fn layout_about_to_be_changed(&mut self) {
0465         (self.layout_about_to_be_changed)(self.qobject);
0466     }
0467     pub fn layout_changed(&mut self) {
0468         (self.layout_changed)(self.qobject);
0469     }
0470     pub fn data_changed(&mut self, first: usize, last: usize) {
0471         (self.data_changed)(self.qobject, first, last);
0472     }
0473     pub fn begin_reset_model(&mut self) {
0474         (self.begin_reset_model)(self.qobject);
0475     }
0476     pub fn end_reset_model(&mut self) {
0477         (self.end_reset_model)(self.qobject);
0478     }
0479     pub fn begin_insert_rows(&mut self, first: usize, last: usize) {
0480         (self.begin_insert_rows)(self.qobject, first, last);
0481     }
0482     pub fn end_insert_rows(&mut self) {
0483         (self.end_insert_rows)(self.qobject);
0484     }
0485     pub fn begin_move_rows(&mut self, first: usize, last: usize, destination: usize) {
0486         (self.begin_move_rows)(self.qobject, first, last, destination);
0487     }
0488     pub fn end_move_rows(&mut self) {
0489         (self.end_move_rows)(self.qobject);
0490     }
0491     pub fn begin_remove_rows(&mut self, first: usize, last: usize) {
0492         (self.begin_remove_rows)(self.qobject, first, last);
0493     }
0494     pub fn end_remove_rows(&mut self) {
0495         (self.end_remove_rows)(self.qobject);
0496     }
0497 }
0498 
0499 pub trait FibonacciListTrait {
0500     fn new(emit: FibonacciListEmitter, model: FibonacciListList) -> Self;
0501     fn emit(&mut self) -> &mut FibonacciListEmitter;
0502     fn row_count(&self) -> usize;
0503     fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
0504     fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
0505     fn can_fetch_more(&self) -> bool {
0506         false
0507     }
0508     fn fetch_more(&mut self) {}
0509     fn sort(&mut self, _: u8, _: SortOrder) {}
0510     fn fibonacci_number(&self, index: usize) -> u64;
0511     fn row(&self, index: usize) -> u64;
0512 }
0513 
0514 #[no_mangle]
0515 pub extern "C" fn fibonacci_list_new(
0516     fibonacci_list: *mut FibonacciListQObject,
0517     fibonacci_list_new_data_ready: extern fn(*mut FibonacciListQObject),
0518     fibonacci_list_layout_about_to_be_changed: extern fn(*mut FibonacciListQObject),
0519     fibonacci_list_layout_changed: extern fn(*mut FibonacciListQObject),
0520     fibonacci_list_data_changed: extern fn(*mut FibonacciListQObject, usize, usize),
0521     fibonacci_list_begin_reset_model: extern fn(*mut FibonacciListQObject),
0522     fibonacci_list_end_reset_model: extern fn(*mut FibonacciListQObject),
0523     fibonacci_list_begin_insert_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0524     fibonacci_list_end_insert_rows: extern fn(*mut FibonacciListQObject),
0525     fibonacci_list_begin_move_rows: extern fn(*mut FibonacciListQObject, usize, usize, usize),
0526     fibonacci_list_end_move_rows: extern fn(*mut FibonacciListQObject),
0527     fibonacci_list_begin_remove_rows: extern fn(*mut FibonacciListQObject, usize, usize),
0528     fibonacci_list_end_remove_rows: extern fn(*mut FibonacciListQObject),
0529 ) -> *mut FibonacciList {
0530     let fibonacci_list_emit = FibonacciListEmitter {
0531         qobject: Arc::new(AtomicPtr::new(fibonacci_list)),
0532         new_data_ready: fibonacci_list_new_data_ready,
0533     };
0534     let model = FibonacciListList {
0535         qobject: fibonacci_list,
0536         layout_about_to_be_changed: fibonacci_list_layout_about_to_be_changed,
0537         layout_changed: fibonacci_list_layout_changed,
0538         data_changed: fibonacci_list_data_changed,
0539         begin_reset_model: fibonacci_list_begin_reset_model,
0540         end_reset_model: fibonacci_list_end_reset_model,
0541         begin_insert_rows: fibonacci_list_begin_insert_rows,
0542         end_insert_rows: fibonacci_list_end_insert_rows,
0543         begin_move_rows: fibonacci_list_begin_move_rows,
0544         end_move_rows: fibonacci_list_end_move_rows,
0545         begin_remove_rows: fibonacci_list_begin_remove_rows,
0546         end_remove_rows: fibonacci_list_end_remove_rows,
0547     };
0548     let d_fibonacci_list = FibonacciList::new(fibonacci_list_emit, model);
0549     Box::into_raw(Box::new(d_fibonacci_list))
0550 }
0551 
0552 #[no_mangle]
0553 pub unsafe extern "C" fn fibonacci_list_free(ptr: *mut FibonacciList) {
0554     Box::from_raw(ptr).emit().clear();
0555 }
0556 
0557 #[no_mangle]
0558 pub unsafe extern "C" fn fibonacci_list_row_count(ptr: *const FibonacciList) -> c_int {
0559     to_c_int((&*ptr).row_count())
0560 }
0561 #[no_mangle]
0562 pub unsafe extern "C" fn fibonacci_list_insert_rows(ptr: *mut FibonacciList, row: c_int, count: c_int) -> bool {
0563     (&mut *ptr).insert_rows(to_usize(row), to_usize(count))
0564 }
0565 #[no_mangle]
0566 pub unsafe extern "C" fn fibonacci_list_remove_rows(ptr: *mut FibonacciList, row: c_int, count: c_int) -> bool {
0567     (&mut *ptr).remove_rows(to_usize(row), to_usize(count))
0568 }
0569 #[no_mangle]
0570 pub unsafe extern "C" fn fibonacci_list_can_fetch_more(ptr: *const FibonacciList) -> bool {
0571     (&*ptr).can_fetch_more()
0572 }
0573 #[no_mangle]
0574 pub unsafe extern "C" fn fibonacci_list_fetch_more(ptr: *mut FibonacciList) {
0575     (&mut *ptr).fetch_more()
0576 }
0577 #[no_mangle]
0578 pub unsafe extern "C" fn fibonacci_list_sort(
0579     ptr: *mut FibonacciList,
0580     column: u8,
0581     order: SortOrder,
0582 ) {
0583     (&mut *ptr).sort(column, order)
0584 }
0585 
0586 #[no_mangle]
0587 pub unsafe extern "C" fn fibonacci_list_data_fibonacci_number(ptr: *const FibonacciList, row: c_int) -> u64 {
0588     let o = &*ptr;
0589     o.fibonacci_number(to_usize(row))
0590 }
0591 
0592 #[no_mangle]
0593 pub unsafe extern "C" fn fibonacci_list_data_row(ptr: *const FibonacciList, row: c_int) -> u64 {
0594     let o = &*ptr;
0595     o.row(to_usize(row))
0596 }
0597 
0598 pub struct FileSystemTreeQObject {}
0599 
0600 pub struct FileSystemTreeEmitter {
0601     qobject: Arc<AtomicPtr<FileSystemTreeQObject>>,
0602     path_changed: extern fn(*mut FileSystemTreeQObject),
0603     new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0604 }
0605 
0606 unsafe impl Send for FileSystemTreeEmitter {}
0607 
0608 impl FileSystemTreeEmitter {
0609     /// Clone the emitter
0610     ///
0611     /// The emitter can only be cloned when it is mutable. The emitter calls
0612     /// into C++ code which may call into Rust again. If emmitting is possible
0613     /// from immutable structures, that might lead to access to a mutable
0614     /// reference. That is undefined behaviour and forbidden.
0615     pub fn clone(&mut self) -> FileSystemTreeEmitter {
0616         FileSystemTreeEmitter {
0617             qobject: self.qobject.clone(),
0618             path_changed: self.path_changed,
0619             new_data_ready: self.new_data_ready,
0620         }
0621     }
0622     fn clear(&self) {
0623         let n: *const FileSystemTreeQObject = null();
0624         self.qobject.store(n as *mut FileSystemTreeQObject, Ordering::SeqCst);
0625     }
0626     pub fn path_changed(&mut self) {
0627         let ptr = self.qobject.load(Ordering::SeqCst);
0628         if !ptr.is_null() {
0629             (self.path_changed)(ptr);
0630         }
0631     }
0632     pub fn new_data_ready(&mut self, item: Option<usize>) {
0633         let ptr = self.qobject.load(Ordering::SeqCst);
0634         if !ptr.is_null() {
0635             (self.new_data_ready)(ptr, item.into());
0636         }
0637     }
0638 }
0639 
0640 #[derive(Clone)]
0641 pub struct FileSystemTreeTree {
0642     qobject: *mut FileSystemTreeQObject,
0643     layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0644     layout_changed: extern fn(*mut FileSystemTreeQObject),
0645     data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0646     begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0647     end_reset_model: extern fn(*mut FileSystemTreeQObject),
0648     begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0649     end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0650     begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, dest: COption<usize>, usize),
0651     end_move_rows: extern fn(*mut FileSystemTreeQObject),
0652     begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0653     end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0654 }
0655 
0656 impl FileSystemTreeTree {
0657     pub fn layout_about_to_be_changed(&mut self) {
0658         (self.layout_about_to_be_changed)(self.qobject);
0659     }
0660     pub fn layout_changed(&mut self) {
0661         (self.layout_changed)(self.qobject);
0662     }
0663     pub fn data_changed(&mut self, first: usize, last: usize) {
0664         (self.data_changed)(self.qobject, first, last);
0665     }
0666     pub fn begin_reset_model(&mut self) {
0667         (self.begin_reset_model)(self.qobject);
0668     }
0669     pub fn end_reset_model(&mut self) {
0670         (self.end_reset_model)(self.qobject);
0671     }
0672     pub fn begin_insert_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0673         (self.begin_insert_rows)(self.qobject, index.into(), first, last);
0674     }
0675     pub fn end_insert_rows(&mut self) {
0676         (self.end_insert_rows)(self.qobject);
0677     }
0678     pub fn begin_move_rows(&mut self, index: Option<usize>, first: usize, last: usize, dest: Option<usize>, destination: usize) {
0679         (self.begin_move_rows)(self.qobject, index.into(), first, last, dest.into(), destination);
0680     }
0681     pub fn end_move_rows(&mut self) {
0682         (self.end_move_rows)(self.qobject);
0683     }
0684     pub fn begin_remove_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0685         (self.begin_remove_rows)(self.qobject, index.into(), first, last);
0686     }
0687     pub fn end_remove_rows(&mut self) {
0688         (self.end_remove_rows)(self.qobject);
0689     }
0690 }
0691 
0692 pub trait FileSystemTreeTrait {
0693     fn new(emit: FileSystemTreeEmitter, model: FileSystemTreeTree) -> Self;
0694     fn emit(&mut self) -> &mut FileSystemTreeEmitter;
0695     fn path(&self) -> Option<&str>;
0696     fn set_path(&mut self, value: Option<String>);
0697     fn row_count(&self, _: Option<usize>) -> usize;
0698     fn can_fetch_more(&self, _: Option<usize>) -> bool {
0699         false
0700     }
0701     fn fetch_more(&mut self, _: Option<usize>) {}
0702     fn sort(&mut self, _: u8, _: SortOrder) {}
0703     fn check_row(&self, index: usize, row: usize) -> Option<usize>;
0704     fn index(&self, item: Option<usize>, row: usize) -> usize;
0705     fn parent(&self, index: usize) -> Option<usize>;
0706     fn row(&self, index: usize) -> usize;
0707     fn file_icon(&self, index: usize) -> &[u8];
0708     fn file_name(&self, index: usize) -> String;
0709     fn file_path(&self, index: usize) -> Option<String>;
0710     fn file_permissions(&self, index: usize) -> i32;
0711     fn file_size(&self, index: usize) -> Option<u64>;
0712     fn file_type(&self, index: usize) -> i32;
0713 }
0714 
0715 #[no_mangle]
0716 pub extern "C" fn file_system_tree_new(
0717     file_system_tree: *mut FileSystemTreeQObject,
0718     file_system_tree_path_changed: extern fn(*mut FileSystemTreeQObject),
0719     file_system_tree_new_data_ready: extern fn(*mut FileSystemTreeQObject, index: COption<usize>),
0720     file_system_tree_layout_about_to_be_changed: extern fn(*mut FileSystemTreeQObject),
0721     file_system_tree_layout_changed: extern fn(*mut FileSystemTreeQObject),
0722     file_system_tree_data_changed: extern fn(*mut FileSystemTreeQObject, usize, usize),
0723     file_system_tree_begin_reset_model: extern fn(*mut FileSystemTreeQObject),
0724     file_system_tree_end_reset_model: extern fn(*mut FileSystemTreeQObject),
0725     file_system_tree_begin_insert_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0726     file_system_tree_end_insert_rows: extern fn(*mut FileSystemTreeQObject),
0727     file_system_tree_begin_move_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
0728     file_system_tree_end_move_rows: extern fn(*mut FileSystemTreeQObject),
0729     file_system_tree_begin_remove_rows: extern fn(*mut FileSystemTreeQObject, index: COption<usize>, usize, usize),
0730     file_system_tree_end_remove_rows: extern fn(*mut FileSystemTreeQObject),
0731 ) -> *mut FileSystemTree {
0732     let file_system_tree_emit = FileSystemTreeEmitter {
0733         qobject: Arc::new(AtomicPtr::new(file_system_tree)),
0734         path_changed: file_system_tree_path_changed,
0735         new_data_ready: file_system_tree_new_data_ready,
0736     };
0737     let model = FileSystemTreeTree {
0738         qobject: file_system_tree,
0739         layout_about_to_be_changed: file_system_tree_layout_about_to_be_changed,
0740         layout_changed: file_system_tree_layout_changed,
0741         data_changed: file_system_tree_data_changed,
0742         begin_reset_model: file_system_tree_begin_reset_model,
0743         end_reset_model: file_system_tree_end_reset_model,
0744         begin_insert_rows: file_system_tree_begin_insert_rows,
0745         end_insert_rows: file_system_tree_end_insert_rows,
0746         begin_move_rows: file_system_tree_begin_move_rows,
0747         end_move_rows: file_system_tree_end_move_rows,
0748         begin_remove_rows: file_system_tree_begin_remove_rows,
0749         end_remove_rows: file_system_tree_end_remove_rows,
0750     };
0751     let d_file_system_tree = FileSystemTree::new(file_system_tree_emit, model);
0752     Box::into_raw(Box::new(d_file_system_tree))
0753 }
0754 
0755 #[no_mangle]
0756 pub unsafe extern "C" fn file_system_tree_free(ptr: *mut FileSystemTree) {
0757     Box::from_raw(ptr).emit().clear();
0758 }
0759 
0760 #[no_mangle]
0761 pub unsafe extern "C" fn file_system_tree_path_get(
0762     ptr: *const FileSystemTree,
0763     p: *mut QString,
0764     set: extern fn(*mut QString, *const c_char, c_int),
0765 ) {
0766     let o = &*ptr;
0767     let v = o.path();
0768     if let Some(v) = v {
0769         let s: *const c_char = v.as_ptr() as *const c_char;
0770         set(p, s, to_c_int(v.len()));
0771     }
0772 }
0773 
0774 #[no_mangle]
0775 pub unsafe extern "C" fn file_system_tree_path_set(ptr: *mut FileSystemTree, v: *const c_ushort, len: c_int) {
0776     let o = &mut *ptr;
0777     let mut s = String::new();
0778     set_string_from_utf16(&mut s, v, len);
0779     o.set_path(Some(s));
0780 }
0781 
0782 #[no_mangle]
0783 pub unsafe extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) {
0784     let o = &mut *ptr;
0785     o.set_path(None);
0786 }
0787 
0788 #[no_mangle]
0789 pub unsafe extern "C" fn file_system_tree_row_count(
0790     ptr: *const FileSystemTree,
0791     index: COption<usize>,
0792 ) -> c_int {
0793     to_c_int((&*ptr).row_count(index.into()))
0794 }
0795 #[no_mangle]
0796 pub unsafe extern "C" fn file_system_tree_can_fetch_more(
0797     ptr: *const FileSystemTree,
0798     index: COption<usize>,
0799 ) -> bool {
0800     (&*ptr).can_fetch_more(index.into())
0801 }
0802 #[no_mangle]
0803 pub unsafe extern "C" fn file_system_tree_fetch_more(ptr: *mut FileSystemTree, index: COption<usize>) {
0804     (&mut *ptr).fetch_more(index.into())
0805 }
0806 #[no_mangle]
0807 pub unsafe extern "C" fn file_system_tree_sort(
0808     ptr: *mut FileSystemTree,
0809     column: u8,
0810     order: SortOrder
0811 ) {
0812     (&mut *ptr).sort(column, order)
0813 }
0814 #[no_mangle]
0815 pub unsafe extern "C" fn file_system_tree_check_row(
0816     ptr: *const FileSystemTree,
0817     index: usize,
0818     row: c_int,
0819 ) -> COption<usize> {
0820     (&*ptr).check_row(index, to_usize(row)).into()
0821 }
0822 #[no_mangle]
0823 pub unsafe extern "C" fn file_system_tree_index(
0824     ptr: *const FileSystemTree,
0825     index: COption<usize>,
0826     row: c_int,
0827 ) -> usize {
0828     (&*ptr).index(index.into(), to_usize(row))
0829 }
0830 #[no_mangle]
0831 pub unsafe extern "C" fn file_system_tree_parent(ptr: *const FileSystemTree, index: usize) -> QModelIndex {
0832     if let Some(parent) = (&*ptr).parent(index) {
0833         QModelIndex {
0834             row: to_c_int((&*ptr).row(parent)),
0835             internal_id: parent,
0836         }
0837     } else {
0838         QModelIndex {
0839             row: -1,
0840             internal_id: 0,
0841         }
0842     }
0843 }
0844 #[no_mangle]
0845 pub unsafe extern "C" fn file_system_tree_row(ptr: *const FileSystemTree, index: usize) -> c_int {
0846     to_c_int((&*ptr).row(index))
0847 }
0848 
0849 #[no_mangle]
0850 pub unsafe extern "C" fn file_system_tree_data_file_icon(
0851     ptr: *const FileSystemTree, index: usize,
0852     d: *mut QByteArray,
0853     set: extern fn(*mut QByteArray, *const c_char, len: c_int),
0854 ) {
0855     let o = &*ptr;
0856     let data = o.file_icon(index);
0857     let s: *const c_char = data.as_ptr() as *const c_char;
0858     set(d, s, to_c_int(data.len()));
0859 }
0860 
0861 #[no_mangle]
0862 pub unsafe extern "C" fn file_system_tree_data_file_name(
0863     ptr: *const FileSystemTree, index: usize,
0864     d: *mut QString,
0865     set: extern fn(*mut QString, *const c_char, len: c_int),
0866 ) {
0867     let o = &*ptr;
0868     let data = o.file_name(index);
0869     let s: *const c_char = data.as_ptr() as *const c_char;
0870     set(d, s, to_c_int(data.len()));
0871 }
0872 
0873 #[no_mangle]
0874 pub unsafe extern "C" fn file_system_tree_data_file_path(
0875     ptr: *const FileSystemTree, index: usize,
0876     d: *mut QString,
0877     set: extern fn(*mut QString, *const c_char, len: c_int),
0878 ) {
0879     let o = &*ptr;
0880     let data = o.file_path(index);
0881     if let Some(data) = data {
0882         let s: *const c_char = data.as_ptr() as *const c_char;
0883         set(d, s, to_c_int(data.len()));
0884     }
0885 }
0886 
0887 #[no_mangle]
0888 pub unsafe extern "C" fn file_system_tree_data_file_permissions(ptr: *const FileSystemTree, index: usize) -> i32 {
0889     let o = &*ptr;
0890     o.file_permissions(index)
0891 }
0892 
0893 #[no_mangle]
0894 pub unsafe extern "C" fn file_system_tree_data_file_size(ptr: *const FileSystemTree, index: usize) -> COption<u64> {
0895     let o = &*ptr;
0896     o.file_size(index).into()
0897 }
0898 
0899 #[no_mangle]
0900 pub unsafe extern "C" fn file_system_tree_data_file_type(ptr: *const FileSystemTree, index: usize) -> i32 {
0901     let o = &*ptr;
0902     o.file_type(index)
0903 }
0904 
0905 pub struct ProcessesQObject {}
0906 
0907 pub struct ProcessesEmitter {
0908     qobject: Arc<AtomicPtr<ProcessesQObject>>,
0909     active_changed: extern fn(*mut ProcessesQObject),
0910     new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
0911 }
0912 
0913 unsafe impl Send for ProcessesEmitter {}
0914 
0915 impl ProcessesEmitter {
0916     /// Clone the emitter
0917     ///
0918     /// The emitter can only be cloned when it is mutable. The emitter calls
0919     /// into C++ code which may call into Rust again. If emmitting is possible
0920     /// from immutable structures, that might lead to access to a mutable
0921     /// reference. That is undefined behaviour and forbidden.
0922     pub fn clone(&mut self) -> ProcessesEmitter {
0923         ProcessesEmitter {
0924             qobject: self.qobject.clone(),
0925             active_changed: self.active_changed,
0926             new_data_ready: self.new_data_ready,
0927         }
0928     }
0929     fn clear(&self) {
0930         let n: *const ProcessesQObject = null();
0931         self.qobject.store(n as *mut ProcessesQObject, Ordering::SeqCst);
0932     }
0933     pub fn active_changed(&mut self) {
0934         let ptr = self.qobject.load(Ordering::SeqCst);
0935         if !ptr.is_null() {
0936             (self.active_changed)(ptr);
0937         }
0938     }
0939     pub fn new_data_ready(&mut self, item: Option<usize>) {
0940         let ptr = self.qobject.load(Ordering::SeqCst);
0941         if !ptr.is_null() {
0942             (self.new_data_ready)(ptr, item.into());
0943         }
0944     }
0945 }
0946 
0947 #[derive(Clone)]
0948 pub struct ProcessesTree {
0949     qobject: *mut ProcessesQObject,
0950     layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
0951     layout_changed: extern fn(*mut ProcessesQObject),
0952     data_changed: extern fn(*mut ProcessesQObject, usize, usize),
0953     begin_reset_model: extern fn(*mut ProcessesQObject),
0954     end_reset_model: extern fn(*mut ProcessesQObject),
0955     begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0956     end_insert_rows: extern fn(*mut ProcessesQObject),
0957     begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, dest: COption<usize>, usize),
0958     end_move_rows: extern fn(*mut ProcessesQObject),
0959     begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
0960     end_remove_rows: extern fn(*mut ProcessesQObject),
0961 }
0962 
0963 impl ProcessesTree {
0964     pub fn layout_about_to_be_changed(&mut self) {
0965         (self.layout_about_to_be_changed)(self.qobject);
0966     }
0967     pub fn layout_changed(&mut self) {
0968         (self.layout_changed)(self.qobject);
0969     }
0970     pub fn data_changed(&mut self, first: usize, last: usize) {
0971         (self.data_changed)(self.qobject, first, last);
0972     }
0973     pub fn begin_reset_model(&mut self) {
0974         (self.begin_reset_model)(self.qobject);
0975     }
0976     pub fn end_reset_model(&mut self) {
0977         (self.end_reset_model)(self.qobject);
0978     }
0979     pub fn begin_insert_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0980         (self.begin_insert_rows)(self.qobject, index.into(), first, last);
0981     }
0982     pub fn end_insert_rows(&mut self) {
0983         (self.end_insert_rows)(self.qobject);
0984     }
0985     pub fn begin_move_rows(&mut self, index: Option<usize>, first: usize, last: usize, dest: Option<usize>, destination: usize) {
0986         (self.begin_move_rows)(self.qobject, index.into(), first, last, dest.into(), destination);
0987     }
0988     pub fn end_move_rows(&mut self) {
0989         (self.end_move_rows)(self.qobject);
0990     }
0991     pub fn begin_remove_rows(&mut self, index: Option<usize>, first: usize, last: usize) {
0992         (self.begin_remove_rows)(self.qobject, index.into(), first, last);
0993     }
0994     pub fn end_remove_rows(&mut self) {
0995         (self.end_remove_rows)(self.qobject);
0996     }
0997 }
0998 
0999 pub trait ProcessesTrait {
1000     fn new(emit: ProcessesEmitter, model: ProcessesTree) -> Self;
1001     fn emit(&mut self) -> &mut ProcessesEmitter;
1002     fn active(&self) -> bool;
1003     fn set_active(&mut self, value: bool);
1004     fn row_count(&self, _: Option<usize>) -> usize;
1005     fn can_fetch_more(&self, _: Option<usize>) -> bool {
1006         false
1007     }
1008     fn fetch_more(&mut self, _: Option<usize>) {}
1009     fn sort(&mut self, _: u8, _: SortOrder) {}
1010     fn check_row(&self, index: usize, row: usize) -> Option<usize>;
1011     fn index(&self, item: Option<usize>, row: usize) -> usize;
1012     fn parent(&self, index: usize) -> Option<usize>;
1013     fn row(&self, index: usize) -> usize;
1014     fn cmd(&self, index: usize) -> String;
1015     fn cpu_percentage(&self, index: usize) -> u8;
1016     fn cpu_usage(&self, index: usize) -> f32;
1017     fn memory(&self, index: usize) -> u64;
1018     fn name(&self, index: usize) -> &str;
1019     fn pid(&self, index: usize) -> u32;
1020     fn uid(&self, index: usize) -> u32;
1021 }
1022 
1023 #[no_mangle]
1024 pub extern "C" fn processes_new(
1025     processes: *mut ProcessesQObject,
1026     processes_active_changed: extern fn(*mut ProcessesQObject),
1027     processes_new_data_ready: extern fn(*mut ProcessesQObject, index: COption<usize>),
1028     processes_layout_about_to_be_changed: extern fn(*mut ProcessesQObject),
1029     processes_layout_changed: extern fn(*mut ProcessesQObject),
1030     processes_data_changed: extern fn(*mut ProcessesQObject, usize, usize),
1031     processes_begin_reset_model: extern fn(*mut ProcessesQObject),
1032     processes_end_reset_model: extern fn(*mut ProcessesQObject),
1033     processes_begin_insert_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
1034     processes_end_insert_rows: extern fn(*mut ProcessesQObject),
1035     processes_begin_move_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize, index: COption<usize>, usize),
1036     processes_end_move_rows: extern fn(*mut ProcessesQObject),
1037     processes_begin_remove_rows: extern fn(*mut ProcessesQObject, index: COption<usize>, usize, usize),
1038     processes_end_remove_rows: extern fn(*mut ProcessesQObject),
1039 ) -> *mut Processes {
1040     let processes_emit = ProcessesEmitter {
1041         qobject: Arc::new(AtomicPtr::new(processes)),
1042         active_changed: processes_active_changed,
1043         new_data_ready: processes_new_data_ready,
1044     };
1045     let model = ProcessesTree {
1046         qobject: processes,
1047         layout_about_to_be_changed: processes_layout_about_to_be_changed,
1048         layout_changed: processes_layout_changed,
1049         data_changed: processes_data_changed,
1050         begin_reset_model: processes_begin_reset_model,
1051         end_reset_model: processes_end_reset_model,
1052         begin_insert_rows: processes_begin_insert_rows,
1053         end_insert_rows: processes_end_insert_rows,
1054         begin_move_rows: processes_begin_move_rows,
1055         end_move_rows: processes_end_move_rows,
1056         begin_remove_rows: processes_begin_remove_rows,
1057         end_remove_rows: processes_end_remove_rows,
1058     };
1059     let d_processes = Processes::new(processes_emit, model);
1060     Box::into_raw(Box::new(d_processes))
1061 }
1062 
1063 #[no_mangle]
1064 pub unsafe extern "C" fn processes_free(ptr: *mut Processes) {
1065     Box::from_raw(ptr).emit().clear();
1066 }
1067 
1068 #[no_mangle]
1069 pub unsafe extern "C" fn processes_active_get(ptr: *const Processes) -> bool {
1070     (&*ptr).active()
1071 }
1072 
1073 #[no_mangle]
1074 pub unsafe extern "C" fn processes_active_set(ptr: *mut Processes, v: bool) {
1075     (&mut *ptr).set_active(v);
1076 }
1077 
1078 #[no_mangle]
1079 pub unsafe extern "C" fn processes_row_count(
1080     ptr: *const Processes,
1081     index: COption<usize>,
1082 ) -> c_int {
1083     to_c_int((&*ptr).row_count(index.into()))
1084 }
1085 #[no_mangle]
1086 pub unsafe extern "C" fn processes_can_fetch_more(
1087     ptr: *const Processes,
1088     index: COption<usize>,
1089 ) -> bool {
1090     (&*ptr).can_fetch_more(index.into())
1091 }
1092 #[no_mangle]
1093 pub unsafe extern "C" fn processes_fetch_more(ptr: *mut Processes, index: COption<usize>) {
1094     (&mut *ptr).fetch_more(index.into())
1095 }
1096 #[no_mangle]
1097 pub unsafe extern "C" fn processes_sort(
1098     ptr: *mut Processes,
1099     column: u8,
1100     order: SortOrder
1101 ) {
1102     (&mut *ptr).sort(column, order)
1103 }
1104 #[no_mangle]
1105 pub unsafe extern "C" fn processes_check_row(
1106     ptr: *const Processes,
1107     index: usize,
1108     row: c_int,
1109 ) -> COption<usize> {
1110     (&*ptr).check_row(index, to_usize(row)).into()
1111 }
1112 #[no_mangle]
1113 pub unsafe extern "C" fn processes_index(
1114     ptr: *const Processes,
1115     index: COption<usize>,
1116     row: c_int,
1117 ) -> usize {
1118     (&*ptr).index(index.into(), to_usize(row))
1119 }
1120 #[no_mangle]
1121 pub unsafe extern "C" fn processes_parent(ptr: *const Processes, index: usize) -> QModelIndex {
1122     if let Some(parent) = (&*ptr).parent(index) {
1123         QModelIndex {
1124             row: to_c_int((&*ptr).row(parent)),
1125             internal_id: parent,
1126         }
1127     } else {
1128         QModelIndex {
1129             row: -1,
1130             internal_id: 0,
1131         }
1132     }
1133 }
1134 #[no_mangle]
1135 pub unsafe extern "C" fn processes_row(ptr: *const Processes, index: usize) -> c_int {
1136     to_c_int((&*ptr).row(index))
1137 }
1138 
1139 #[no_mangle]
1140 pub unsafe extern "C" fn processes_data_cmd(
1141     ptr: *const Processes, index: usize,
1142     d: *mut QString,
1143     set: extern fn(*mut QString, *const c_char, len: c_int),
1144 ) {
1145     let o = &*ptr;
1146     let data = o.cmd(index);
1147     let s: *const c_char = data.as_ptr() as *const c_char;
1148     set(d, s, to_c_int(data.len()));
1149 }
1150 
1151 #[no_mangle]
1152 pub unsafe extern "C" fn processes_data_cpu_percentage(ptr: *const Processes, index: usize) -> u8 {
1153     let o = &*ptr;
1154     o.cpu_percentage(index)
1155 }
1156 
1157 #[no_mangle]
1158 pub unsafe extern "C" fn processes_data_cpu_usage(ptr: *const Processes, index: usize) -> f32 {
1159     let o = &*ptr;
1160     o.cpu_usage(index)
1161 }
1162 
1163 #[no_mangle]
1164 pub unsafe extern "C" fn processes_data_memory(ptr: *const Processes, index: usize) -> u64 {
1165     let o = &*ptr;
1166     o.memory(index)
1167 }
1168 
1169 #[no_mangle]
1170 pub unsafe extern "C" fn processes_data_name(
1171     ptr: *const Processes, index: usize,
1172     d: *mut QString,
1173     set: extern fn(*mut QString, *const c_char, len: c_int),
1174 ) {
1175     let o = &*ptr;
1176     let data = o.name(index);
1177     let s: *const c_char = data.as_ptr() as *const c_char;
1178     set(d, s, to_c_int(data.len()));
1179 }
1180 
1181 #[no_mangle]
1182 pub unsafe extern "C" fn processes_data_pid(ptr: *const Processes, index: usize) -> u32 {
1183     let o = &*ptr;
1184     o.pid(index)
1185 }
1186 
1187 #[no_mangle]
1188 pub unsafe extern "C" fn processes_data_uid(ptr: *const Processes, index: usize) -> u32 {
1189     let o = &*ptr;
1190     o.uid(index)
1191 }
1192 
1193 pub struct TimeSeriesQObject {}
1194 
1195 pub struct TimeSeriesEmitter {
1196     qobject: Arc<AtomicPtr<TimeSeriesQObject>>,
1197     new_data_ready: extern fn(*mut TimeSeriesQObject),
1198 }
1199 
1200 unsafe impl Send for TimeSeriesEmitter {}
1201 
1202 impl TimeSeriesEmitter {
1203     /// Clone the emitter
1204     ///
1205     /// The emitter can only be cloned when it is mutable. The emitter calls
1206     /// into C++ code which may call into Rust again. If emmitting is possible
1207     /// from immutable structures, that might lead to access to a mutable
1208     /// reference. That is undefined behaviour and forbidden.
1209     pub fn clone(&mut self) -> TimeSeriesEmitter {
1210         TimeSeriesEmitter {
1211             qobject: self.qobject.clone(),
1212             new_data_ready: self.new_data_ready,
1213         }
1214     }
1215     fn clear(&self) {
1216         let n: *const TimeSeriesQObject = null();
1217         self.qobject.store(n as *mut TimeSeriesQObject, Ordering::SeqCst);
1218     }
1219     pub fn new_data_ready(&mut self) {
1220         let ptr = self.qobject.load(Ordering::SeqCst);
1221         if !ptr.is_null() {
1222             (self.new_data_ready)(ptr);
1223         }
1224     }
1225 }
1226 
1227 #[derive(Clone)]
1228 pub struct TimeSeriesList {
1229     qobject: *mut TimeSeriesQObject,
1230     layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
1231     layout_changed: extern fn(*mut TimeSeriesQObject),
1232     data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
1233     begin_reset_model: extern fn(*mut TimeSeriesQObject),
1234     end_reset_model: extern fn(*mut TimeSeriesQObject),
1235     begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1236     end_insert_rows: extern fn(*mut TimeSeriesQObject),
1237     begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
1238     end_move_rows: extern fn(*mut TimeSeriesQObject),
1239     begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1240     end_remove_rows: extern fn(*mut TimeSeriesQObject),
1241 }
1242 
1243 impl TimeSeriesList {
1244     pub fn layout_about_to_be_changed(&mut self) {
1245         (self.layout_about_to_be_changed)(self.qobject);
1246     }
1247     pub fn layout_changed(&mut self) {
1248         (self.layout_changed)(self.qobject);
1249     }
1250     pub fn data_changed(&mut self, first: usize, last: usize) {
1251         (self.data_changed)(self.qobject, first, last);
1252     }
1253     pub fn begin_reset_model(&mut self) {
1254         (self.begin_reset_model)(self.qobject);
1255     }
1256     pub fn end_reset_model(&mut self) {
1257         (self.end_reset_model)(self.qobject);
1258     }
1259     pub fn begin_insert_rows(&mut self, first: usize, last: usize) {
1260         (self.begin_insert_rows)(self.qobject, first, last);
1261     }
1262     pub fn end_insert_rows(&mut self) {
1263         (self.end_insert_rows)(self.qobject);
1264     }
1265     pub fn begin_move_rows(&mut self, first: usize, last: usize, destination: usize) {
1266         (self.begin_move_rows)(self.qobject, first, last, destination);
1267     }
1268     pub fn end_move_rows(&mut self) {
1269         (self.end_move_rows)(self.qobject);
1270     }
1271     pub fn begin_remove_rows(&mut self, first: usize, last: usize) {
1272         (self.begin_remove_rows)(self.qobject, first, last);
1273     }
1274     pub fn end_remove_rows(&mut self) {
1275         (self.end_remove_rows)(self.qobject);
1276     }
1277 }
1278 
1279 pub trait TimeSeriesTrait {
1280     fn new(emit: TimeSeriesEmitter, model: TimeSeriesList) -> Self;
1281     fn emit(&mut self) -> &mut TimeSeriesEmitter;
1282     fn row_count(&self) -> usize;
1283     fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
1284     fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
1285     fn can_fetch_more(&self) -> bool {
1286         false
1287     }
1288     fn fetch_more(&mut self) {}
1289     fn sort(&mut self, _: u8, _: SortOrder) {}
1290     fn cos(&self, index: usize) -> f32;
1291     fn set_cos(&mut self, index: usize, _: f32) -> bool;
1292     fn sin(&self, index: usize) -> f32;
1293     fn set_sin(&mut self, index: usize, _: f32) -> bool;
1294     fn time(&self, index: usize) -> f32;
1295     fn set_time(&mut self, index: usize, _: f32) -> bool;
1296 }
1297 
1298 #[no_mangle]
1299 pub extern "C" fn time_series_new(
1300     time_series: *mut TimeSeriesQObject,
1301     time_series_new_data_ready: extern fn(*mut TimeSeriesQObject),
1302     time_series_layout_about_to_be_changed: extern fn(*mut TimeSeriesQObject),
1303     time_series_layout_changed: extern fn(*mut TimeSeriesQObject),
1304     time_series_data_changed: extern fn(*mut TimeSeriesQObject, usize, usize),
1305     time_series_begin_reset_model: extern fn(*mut TimeSeriesQObject),
1306     time_series_end_reset_model: extern fn(*mut TimeSeriesQObject),
1307     time_series_begin_insert_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1308     time_series_end_insert_rows: extern fn(*mut TimeSeriesQObject),
1309     time_series_begin_move_rows: extern fn(*mut TimeSeriesQObject, usize, usize, usize),
1310     time_series_end_move_rows: extern fn(*mut TimeSeriesQObject),
1311     time_series_begin_remove_rows: extern fn(*mut TimeSeriesQObject, usize, usize),
1312     time_series_end_remove_rows: extern fn(*mut TimeSeriesQObject),
1313 ) -> *mut TimeSeries {
1314     let time_series_emit = TimeSeriesEmitter {
1315         qobject: Arc::new(AtomicPtr::new(time_series)),
1316         new_data_ready: time_series_new_data_ready,
1317     };
1318     let model = TimeSeriesList {
1319         qobject: time_series,
1320         layout_about_to_be_changed: time_series_layout_about_to_be_changed,
1321         layout_changed: time_series_layout_changed,
1322         data_changed: time_series_data_changed,
1323         begin_reset_model: time_series_begin_reset_model,
1324         end_reset_model: time_series_end_reset_model,
1325         begin_insert_rows: time_series_begin_insert_rows,
1326         end_insert_rows: time_series_end_insert_rows,
1327         begin_move_rows: time_series_begin_move_rows,
1328         end_move_rows: time_series_end_move_rows,
1329         begin_remove_rows: time_series_begin_remove_rows,
1330         end_remove_rows: time_series_end_remove_rows,
1331     };
1332     let d_time_series = TimeSeries::new(time_series_emit, model);
1333     Box::into_raw(Box::new(d_time_series))
1334 }
1335 
1336 #[no_mangle]
1337 pub unsafe extern "C" fn time_series_free(ptr: *mut TimeSeries) {
1338     Box::from_raw(ptr).emit().clear();
1339 }
1340 
1341 #[no_mangle]
1342 pub unsafe extern "C" fn time_series_row_count(ptr: *const TimeSeries) -> c_int {
1343     to_c_int((&*ptr).row_count())
1344 }
1345 #[no_mangle]
1346 pub unsafe extern "C" fn time_series_insert_rows(ptr: *mut TimeSeries, row: c_int, count: c_int) -> bool {
1347     (&mut *ptr).insert_rows(to_usize(row), to_usize(count))
1348 }
1349 #[no_mangle]
1350 pub unsafe extern "C" fn time_series_remove_rows(ptr: *mut TimeSeries, row: c_int, count: c_int) -> bool {
1351     (&mut *ptr).remove_rows(to_usize(row), to_usize(count))
1352 }
1353 #[no_mangle]
1354 pub unsafe extern "C" fn time_series_can_fetch_more(ptr: *const TimeSeries) -> bool {
1355     (&*ptr).can_fetch_more()
1356 }
1357 #[no_mangle]
1358 pub unsafe extern "C" fn time_series_fetch_more(ptr: *mut TimeSeries) {
1359     (&mut *ptr).fetch_more()
1360 }
1361 #[no_mangle]
1362 pub unsafe extern "C" fn time_series_sort(
1363     ptr: *mut TimeSeries,
1364     column: u8,
1365     order: SortOrder,
1366 ) {
1367     (&mut *ptr).sort(column, order)
1368 }
1369 
1370 #[no_mangle]
1371 pub unsafe extern "C" fn time_series_data_cos(ptr: *const TimeSeries, row: c_int) -> f32 {
1372     let o = &*ptr;
1373     o.cos(to_usize(row))
1374 }
1375 
1376 #[no_mangle]
1377 pub unsafe extern "C" fn time_series_set_data_cos(
1378     ptr: *mut TimeSeries, row: c_int,
1379     v: f32,
1380 ) -> bool {
1381     (&mut *ptr).set_cos(to_usize(row), v)
1382 }
1383 
1384 #[no_mangle]
1385 pub unsafe extern "C" fn time_series_data_sin(ptr: *const TimeSeries, row: c_int) -> f32 {
1386     let o = &*ptr;
1387     o.sin(to_usize(row))
1388 }
1389 
1390 #[no_mangle]
1391 pub unsafe extern "C" fn time_series_set_data_sin(
1392     ptr: *mut TimeSeries, row: c_int,
1393     v: f32,
1394 ) -> bool {
1395     (&mut *ptr).set_sin(to_usize(row), v)
1396 }
1397 
1398 #[no_mangle]
1399 pub unsafe extern "C" fn time_series_data_time(ptr: *const TimeSeries, row: c_int) -> f32 {
1400     let o = &*ptr;
1401     o.time(to_usize(row))
1402 }
1403 
1404 #[no_mangle]
1405 pub unsafe extern "C" fn time_series_set_data_time(
1406     ptr: *mut TimeSeries, row: c_int,
1407     v: f32,
1408 ) -> bool {
1409     (&mut *ptr).set_time(to_usize(row), v)
1410 }