Warning, /sdk/rust-qt-binding-generator/examples/todos/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 #[repr(C)] 0063 #[derive(PartialEq, Eq, Debug)] 0064 pub enum SortOrder { 0065 Ascending = 0, 0066 Descending = 1, 0067 } 0068 0069 #[repr(C)] 0070 pub struct QModelIndex { 0071 row: c_int, 0072 internal_id: usize, 0073 } 0074 0075 0076 fn to_usize(n: c_int) -> usize { 0077 if n < 0 { 0078 panic!("Cannot cast {} to usize", n); 0079 } 0080 n as usize 0081 } 0082 0083 0084 fn to_c_int(n: usize) -> c_int { 0085 if n > c_int::max_value() as usize { 0086 panic!("Cannot cast {} to c_int", n); 0087 } 0088 n as c_int 0089 } 0090 0091 0092 pub struct TodosQObject {} 0093 0094 pub struct TodosEmitter { 0095 qobject: Arc<AtomicPtr<TodosQObject>>, 0096 active_count_changed: fn(*mut TodosQObject), 0097 count_changed: fn(*mut TodosQObject), 0098 new_data_ready: fn(*mut TodosQObject), 0099 } 0100 0101 unsafe impl Send for TodosEmitter {} 0102 0103 impl TodosEmitter { 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) -> TodosEmitter { 0111 TodosEmitter { 0112 qobject: self.qobject.clone(), 0113 active_count_changed: self.active_count_changed, 0114 count_changed: self.count_changed, 0115 new_data_ready: self.new_data_ready, 0116 } 0117 } 0118 fn clear(&self) { 0119 let n: *const TodosQObject = null(); 0120 self.qobject.store(n as *mut TodosQObject, Ordering::SeqCst); 0121 } 0122 pub fn active_count_changed(&mut self) { 0123 let ptr = self.qobject.load(Ordering::SeqCst); 0124 if !ptr.is_null() { 0125 (self.active_count_changed)(ptr); 0126 } 0127 } 0128 pub fn count_changed(&mut self) { 0129 let ptr = self.qobject.load(Ordering::SeqCst); 0130 if !ptr.is_null() { 0131 (self.count_changed)(ptr); 0132 } 0133 } 0134 pub fn new_data_ready(&mut self) { 0135 let ptr = self.qobject.load(Ordering::SeqCst); 0136 if !ptr.is_null() { 0137 (self.new_data_ready)(ptr); 0138 } 0139 } 0140 } 0141 0142 #[derive(Clone)] 0143 pub struct TodosList { 0144 qobject: *mut TodosQObject, 0145 layout_about_to_be_changed: fn(*mut TodosQObject), 0146 layout_changed: fn(*mut TodosQObject), 0147 data_changed: fn(*mut TodosQObject, usize, usize), 0148 begin_reset_model: fn(*mut TodosQObject), 0149 end_reset_model: fn(*mut TodosQObject), 0150 begin_insert_rows: fn(*mut TodosQObject, usize, usize), 0151 end_insert_rows: fn(*mut TodosQObject), 0152 begin_move_rows: fn(*mut TodosQObject, usize, usize, usize), 0153 end_move_rows: fn(*mut TodosQObject), 0154 begin_remove_rows: fn(*mut TodosQObject, usize, usize), 0155 end_remove_rows: fn(*mut TodosQObject), 0156 } 0157 0158 impl TodosList { 0159 pub fn layout_about_to_be_changed(&mut self) { 0160 (self.layout_about_to_be_changed)(self.qobject); 0161 } 0162 pub fn layout_changed(&mut self) { 0163 (self.layout_changed)(self.qobject); 0164 } 0165 pub fn data_changed(&mut self, first: usize, last: usize) { 0166 (self.data_changed)(self.qobject, first, last); 0167 } 0168 pub fn begin_reset_model(&mut self) { 0169 (self.begin_reset_model)(self.qobject); 0170 } 0171 pub fn end_reset_model(&mut self) { 0172 (self.end_reset_model)(self.qobject); 0173 } 0174 pub fn begin_insert_rows(&mut self, first: usize, last: usize) { 0175 (self.begin_insert_rows)(self.qobject, first, last); 0176 } 0177 pub fn end_insert_rows(&mut self) { 0178 (self.end_insert_rows)(self.qobject); 0179 } 0180 pub fn begin_move_rows(&mut self, first: usize, last: usize, destination: usize) { 0181 (self.begin_move_rows)(self.qobject, first, last, destination); 0182 } 0183 pub fn end_move_rows(&mut self) { 0184 (self.end_move_rows)(self.qobject); 0185 } 0186 pub fn begin_remove_rows(&mut self, first: usize, last: usize) { 0187 (self.begin_remove_rows)(self.qobject, first, last); 0188 } 0189 pub fn end_remove_rows(&mut self) { 0190 (self.end_remove_rows)(self.qobject); 0191 } 0192 } 0193 0194 pub trait TodosTrait { 0195 fn new(emit: TodosEmitter, model: TodosList) -> Self; 0196 fn emit(&mut self) -> &mut TodosEmitter; 0197 fn active_count(&self) -> u64; 0198 fn count(&self) -> u64; 0199 fn add(&mut self, description: String) -> (); 0200 fn clear_completed(&mut self) -> (); 0201 fn remove(&mut self, index: u64) -> bool; 0202 fn set_all(&mut self, completed: bool) -> (); 0203 fn row_count(&self) -> usize; 0204 fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false } 0205 fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false } 0206 fn can_fetch_more(&self) -> bool { 0207 false 0208 } 0209 fn fetch_more(&mut self) {} 0210 fn sort(&mut self, _: u8, _: SortOrder) {} 0211 fn completed(&self, index: usize) -> bool; 0212 fn set_completed(&mut self, index: usize, _: bool) -> bool; 0213 fn description(&self, index: usize) -> &str; 0214 fn set_description(&mut self, index: usize, _: String) -> bool; 0215 } 0216 0217 #[no_mangle] 0218 pub extern "C" fn todos_new( 0219 todos: *mut TodosQObject, 0220 todos_active_count_changed: fn(*mut TodosQObject), 0221 todos_count_changed: fn(*mut TodosQObject), 0222 todos_new_data_ready: fn(*mut TodosQObject), 0223 todos_layout_about_to_be_changed: fn(*mut TodosQObject), 0224 todos_layout_changed: fn(*mut TodosQObject), 0225 todos_data_changed: fn(*mut TodosQObject, usize, usize), 0226 todos_begin_reset_model: fn(*mut TodosQObject), 0227 todos_end_reset_model: fn(*mut TodosQObject), 0228 todos_begin_insert_rows: fn(*mut TodosQObject, usize, usize), 0229 todos_end_insert_rows: fn(*mut TodosQObject), 0230 todos_begin_move_rows: fn(*mut TodosQObject, usize, usize, usize), 0231 todos_end_move_rows: fn(*mut TodosQObject), 0232 todos_begin_remove_rows: fn(*mut TodosQObject, usize, usize), 0233 todos_end_remove_rows: fn(*mut TodosQObject), 0234 ) -> *mut Todos { 0235 let todos_emit = TodosEmitter { 0236 qobject: Arc::new(AtomicPtr::new(todos)), 0237 active_count_changed: todos_active_count_changed, 0238 count_changed: todos_count_changed, 0239 new_data_ready: todos_new_data_ready, 0240 }; 0241 let model = TodosList { 0242 qobject: todos, 0243 layout_about_to_be_changed: todos_layout_about_to_be_changed, 0244 layout_changed: todos_layout_changed, 0245 data_changed: todos_data_changed, 0246 begin_reset_model: todos_begin_reset_model, 0247 end_reset_model: todos_end_reset_model, 0248 begin_insert_rows: todos_begin_insert_rows, 0249 end_insert_rows: todos_end_insert_rows, 0250 begin_move_rows: todos_begin_move_rows, 0251 end_move_rows: todos_end_move_rows, 0252 begin_remove_rows: todos_begin_remove_rows, 0253 end_remove_rows: todos_end_remove_rows, 0254 }; 0255 let d_todos = Todos::new(todos_emit, model); 0256 Box::into_raw(Box::new(d_todos)) 0257 } 0258 0259 #[no_mangle] 0260 pub unsafe extern "C" fn todos_free(ptr: *mut Todos) { 0261 Box::from_raw(ptr).emit().clear(); 0262 } 0263 0264 #[no_mangle] 0265 pub unsafe extern "C" fn todos_active_count_get(ptr: *const Todos) -> u64 { 0266 (&*ptr).active_count() 0267 } 0268 0269 #[no_mangle] 0270 pub unsafe extern "C" fn todos_count_get(ptr: *const Todos) -> u64 { 0271 (&*ptr).count() 0272 } 0273 0274 #[no_mangle] 0275 pub unsafe extern "C" fn todos_add(ptr: *mut Todos, description_str: *const c_ushort, description_len: c_int) { 0276 let mut description = String::new(); 0277 set_string_from_utf16(&mut description, description_str, description_len); 0278 let o = &mut *ptr; 0279 o.add(description) 0280 } 0281 0282 #[no_mangle] 0283 pub unsafe extern "C" fn todos_clear_completed(ptr: *mut Todos) { 0284 let o = &mut *ptr; 0285 o.clear_completed() 0286 } 0287 0288 #[no_mangle] 0289 pub unsafe extern "C" fn todos_remove(ptr: *mut Todos, index: u64) -> bool { 0290 let o = &mut *ptr; 0291 o.remove(index) 0292 } 0293 0294 #[no_mangle] 0295 pub unsafe extern "C" fn todos_set_all(ptr: *mut Todos, completed: bool) { 0296 let o = &mut *ptr; 0297 o.set_all(completed) 0298 } 0299 0300 #[no_mangle] 0301 pub unsafe extern "C" fn todos_row_count(ptr: *const Todos) -> c_int { 0302 to_c_int((&*ptr).row_count()) 0303 } 0304 #[no_mangle] 0305 pub unsafe extern "C" fn todos_insert_rows(ptr: *mut Todos, row: c_int, count: c_int) -> bool { 0306 (&mut *ptr).insert_rows(to_usize(row), to_usize(count)) 0307 } 0308 #[no_mangle] 0309 pub unsafe extern "C" fn todos_remove_rows(ptr: *mut Todos, row: c_int, count: c_int) -> bool { 0310 (&mut *ptr).remove_rows(to_usize(row), to_usize(count)) 0311 } 0312 #[no_mangle] 0313 pub unsafe extern "C" fn todos_can_fetch_more(ptr: *const Todos) -> bool { 0314 (&*ptr).can_fetch_more() 0315 } 0316 #[no_mangle] 0317 pub unsafe extern "C" fn todos_fetch_more(ptr: *mut Todos) { 0318 (&mut *ptr).fetch_more() 0319 } 0320 #[no_mangle] 0321 pub unsafe extern "C" fn todos_sort( 0322 ptr: *mut Todos, 0323 column: u8, 0324 order: SortOrder, 0325 ) { 0326 (&mut *ptr).sort(column, order) 0327 } 0328 0329 #[no_mangle] 0330 pub unsafe extern "C" fn todos_data_completed(ptr: *const Todos, row: c_int) -> bool { 0331 let o = &*ptr; 0332 o.completed(to_usize(row)) 0333 } 0334 0335 #[no_mangle] 0336 pub unsafe extern "C" fn todos_set_data_completed( 0337 ptr: *mut Todos, row: c_int, 0338 v: bool, 0339 ) -> bool { 0340 (&mut *ptr).set_completed(to_usize(row), v) 0341 } 0342 0343 #[no_mangle] 0344 pub unsafe extern "C" fn todos_data_description( 0345 ptr: *const Todos, row: c_int, 0346 d: *mut QString, 0347 set: fn(*mut QString, *const c_char, len: c_int), 0348 ) { 0349 let o = &*ptr; 0350 let data = o.description(to_usize(row)); 0351 let s: *const c_char = data.as_ptr() as *const c_char; 0352 set(d, s, to_c_int(data.len())); 0353 } 0354 0355 #[no_mangle] 0356 pub unsafe extern "C" fn todos_set_data_description( 0357 ptr: *mut Todos, row: c_int, 0358 s: *const c_ushort, len: c_int, 0359 ) -> bool { 0360 let o = &mut *ptr; 0361 let mut v = String::new(); 0362 set_string_from_utf16(&mut v, s, len); 0363 o.set_description(to_usize(row), v) 0364 }