Allow optional primitive object properties

master
Jos van den Oever 2018-05-15 21:45:05 +02:00
parent a051556990
commit 392153f9a9
21 changed files with 461 additions and 74 deletions

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;
@ -388,8 +388,8 @@ pub trait FibonacciListTrait {
fn new(emit: FibonacciListEmitter, model: FibonacciListList) -> Self; fn new(emit: FibonacciListEmitter, model: FibonacciListList) -> Self;
fn emit(&self) -> &FibonacciListEmitter; fn emit(&self) -> &FibonacciListEmitter;
fn row_count(&self) -> usize; fn row_count(&self) -> usize;
fn insert_rows(&mut self, row: usize, count: usize) -> bool { false } fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn remove_rows(&mut self, row: usize, count: usize) -> bool { false } fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn can_fetch_more(&self) -> bool { fn can_fetch_more(&self) -> bool {
false false
} }
@ -619,6 +619,7 @@ pub extern "C" fn file_system_tree_path_set(ptr: *mut FileSystemTree, v: *const
set_string_from_utf16(&mut s, v, len); set_string_from_utf16(&mut s, v, len);
o.set_path(Some(s)); o.set_path(Some(s));
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) { pub extern "C" fn file_system_tree_path_set_none(ptr: *mut FileSystemTree) {
let o = unsafe { &mut *ptr }; let o = unsafe { &mut *ptr };
@ -1074,8 +1075,8 @@ pub trait TimeSeriesTrait {
fn new(emit: TimeSeriesEmitter, model: TimeSeriesList) -> Self; fn new(emit: TimeSeriesEmitter, model: TimeSeriesList) -> Self;
fn emit(&self) -> &TimeSeriesEmitter; fn emit(&self) -> &TimeSeriesEmitter;
fn row_count(&self) -> usize; fn row_count(&self) -> usize;
fn insert_rows(&mut self, row: usize, count: usize) -> bool { false } fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn remove_rows(&mut self, row: usize, count: usize) -> bool { false } fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn can_fetch_more(&self) -> bool { fn can_fetch_more(&self) -> bool {
false false
} }

View File

@ -516,8 +516,12 @@ private:
)"; )";
for (auto p: o.properties) { for (auto p: o.properties) {
bool obj = p.type.type == BindingType::Object; bool obj = p.type.type == BindingType::Object;
auto t = p.type.name;
if (p.optional && !p.type.isComplex()) {
t = "QVariant";
}
h << QString(" Q_PROPERTY(%1 %2 READ %2 %3NOTIFY %2Changed FINAL)") h << QString(" Q_PROPERTY(%1 %2 READ %2 %3NOTIFY %2Changed FINAL)")
.arg(p.type.name + (obj ?"*" :""), .arg(t + (obj ?"*" :""),
p.name, p.name,
p.write ? writeProperty(p.name) :"") p.write ? writeProperty(p.name) :"")
<< endl; << endl;
@ -532,9 +536,15 @@ public:
h << " const " << p.type.name << "* " << p.name << "() const;" << endl; h << " const " << p.type.name << "* " << p.name << "() const;" << endl;
h << " " << p.type.name << "* " << p.name << "();" << endl; h << " " << p.type.name << "* " << p.name << "();" << endl;
} else { } else {
h << " " << p.type.name << " " << p.name << "() const;" << endl; auto t = p.type.name;
auto t2 = p.type.cppSetType;
if (p.optional && !p.type.isComplex()) {
t = "QVariant";
t2 = "const QVariant&";
}
h << " " << t << " " << p.name << "() const;" << endl;
if (p.write) { if (p.write) {
h << " void set" << upperInitial(p.name) << "(" << p.type.cppSetType << " v);" << endl; h << " void set" << upperInitial(p.name) << "(" << t2 << " v);" << endl;
} }
} }
} }
@ -730,6 +740,9 @@ void writeObjectCDecl(QTextStream& cpp, const Object& o, const Configuration& co
} else if (p.type.isComplex()) { } else if (p.type.isComplex()) {
cpp << QString(" void %2_get(const %1::Private*, %3);") cpp << QString(" void %2_get(const %1::Private*, %3);")
.arg(o.name, base, cGetType(p.type)) << endl; .arg(o.name, base, cGetType(p.type)) << endl;
} else if (p.optional) {
cpp << QString(" option_%3 %2_get(const %1::Private*);")
.arg(o.name, base, p.type.name) << endl;
} else { } else {
cpp << QString(" %3 %2_get(const %1::Private*);") cpp << QString(" %3 %2_get(const %1::Private*);")
.arg(o.name, base, p.type.name) << endl; .arg(o.name, base, p.type.name) << endl;
@ -868,20 +881,39 @@ void writeCppObject(QTextStream& cpp, const Object& o, const Configuration& conf
cpp << " " << base << "_get(m_d, &v, set_" << p.type.name.toLower() cpp << " " << base << "_get(m_d, &v, set_" << p.type.name.toLower()
<< ");\n"; << ");\n";
cpp << " return v;\n}\n"; cpp << " return v;\n}\n";
} else if (p.optional) {
cpp << QString("QVariant %1::%2() const\n{\n").arg(o.name, p.name);
cpp << " QVariant v;\n";
cpp << QString(" auto r = %1_get(m_d);\n").arg(base);
cpp << " if (r.some) {\n";
cpp << " v.setValue(r.value);\n";
cpp << " }\n";
cpp << " return r;\n";
cpp << "}\n";
} else { } else {
cpp << QString("%3 %1::%2() const\n{\n").arg(o.name, p.name, p.type.name); cpp << QString("%3 %1::%2() const\n{\n").arg(o.name, p.name, p.type.name);
cpp << QString(" return %1_get(m_d);\n}\n").arg(base); cpp << QString(" return %1_get(m_d);\n}\n").arg(base);
} }
if (p.write) { if (p.write) {
cpp << "void " << o.name << "::set" << upperInitial(p.name) << "(" << p.type.cppSetType << " v) {" << endl; auto t = p.type.cppSetType;
if (p.optional && !p.type.isComplex()) {
t = "const QVariant&";
}
cpp << "void " << o.name << "::set" << upperInitial(p.name) << "(" << t << " v) {" << endl;
if (p.optional) { if (p.optional) {
cpp << QString(" if (v.isNull()) {") << endl; if (p.type.isComplex()) {
cpp << " if (v.isNull()) {" << endl;
} else {
cpp << QString(" if (v.isNull() || !v.canConvert<%1>()) {").arg(p.type.name) << endl;
}
cpp << QString(" %1_set_none(m_d);").arg(base) << endl; cpp << QString(" %1_set_none(m_d);").arg(base) << endl;
cpp << QString(" } else {") << endl; cpp << QString(" } else {") << endl;
if (p.type.name == "QString") { if (p.type.name == "QString") {
cpp << QString(" %1_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size());").arg(base) << endl; cpp << QString(" %1_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size());").arg(base) << endl;
} else if (p.type.name == "QByteArray") { } else if (p.type.name == "QByteArray") {
cpp << QString(" %1_set(m_d, v.data(), v.size());").arg(base) << endl; cpp << QString(" %1_set(m_d, v.data(), v.size());").arg(base) << endl;
} else if (p.optional) {
cpp << QString(" %1_set(m_d, v.value<%2>());").arg(base, p.type.name) << endl;
} else { } else {
cpp << QString(" %1_set(m_d, v);").arg(base) << endl; cpp << QString(" %1_set(m_d, v);").arg(base) << endl;
} }

View File

@ -353,8 +353,8 @@ pub trait %1Trait {
} }
if (o.type == ObjectType::List) { if (o.type == ObjectType::List) {
r << R"( fn row_count(&self) -> usize; r << R"( fn row_count(&self) -> usize;
fn insert_rows(&mut self, row: usize, count: usize) -> bool { false } fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn remove_rows(&mut self, row: usize, count: usize) -> bool { false } fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn can_fetch_more(&self) -> bool { fn can_fetch_more(&self) -> bool {
false false
} }
@ -470,11 +470,6 @@ pub extern "C" fn %2_set(ptr: *mut %1, v: *const c_ushort, len: c_int) {
set_string_from_utf16(&mut s, v, len); set_string_from_utf16(&mut s, v, len);
o.set_%3(Some(s)); o.set_%3(Some(s));
} }
#[no_mangle]
pub extern "C" fn %2_set_none(ptr: *mut %1) {
let o = unsafe { &mut *ptr };
o.set_%3(None);
}
)").arg(o.name, base, snakeCase(p.name)); )").arg(o.name, base, snakeCase(p.name));
} else if (p.write) { } else if (p.write) {
r << QString(R"( r << QString(R"(
@ -484,13 +479,26 @@ pub extern "C" fn %2_set(ptr: *mut %1, v: *const c_char, len: c_int) {
let v = unsafe { slice::from_raw_parts(v as *const u8, len as usize) }; let v = unsafe { slice::from_raw_parts(v as *const u8, len as usize) };
o.set_%3(Some(v.into())); o.set_%3(Some(v.into()));
} }
#[no_mangle]
pub extern "C" fn %2_set_none(ptr: *mut %1) {
let o = unsafe { &mut *ptr };
o.set_%3(None);
}
)").arg(o.name, base, snakeCase(p.name)); )").arg(o.name, base, snakeCase(p.name));
} }
} else if (p.optional) {
r << QString(R"(
#[no_mangle]
pub unsafe extern "C" fn %2_get(ptr: *const %1) -> COption<%4> {
match (&*ptr).%3() {
Some(value) => COption { data: value, some: true },
None => COption { data: %4::default(), some: false}
}
}
)").arg(o.name, base, snakeCase(p.name), p.type.rustType);
if (p.write) {
r << QString(R"(
#[no_mangle]
pub unsafe extern "C" fn %2_set(ptr: *mut %1, v: %4) {
(&mut *ptr).set_%3(Some(v));
}
)").arg(o.name, base, snakeCase(p.name), p.type.rustType);
}
} else { } else {
r << QString(R"( r << QString(R"(
#[no_mangle] #[no_mangle]
@ -507,6 +515,15 @@ pub unsafe extern "C" fn %2_set(ptr: *mut %1, v: %4) {
)").arg(o.name, base, snakeCase(p.name), rustType(p)); )").arg(o.name, base, snakeCase(p.name), rustType(p));
} }
} }
if (p.write && p.optional) {
r << QString(R"(
#[no_mangle]
pub extern "C" fn %2_set_none(ptr: *mut %1) {
let o = unsafe { &mut *ptr };
o.set_%3(None);
}
)").arg(o.name, base, snakeCase(p.name));
}
} }
for (const Function& f: o.functions) { for (const Function& f: o.functions) {
writeFunction(r, f, lcname, o); writeFunction(r, f, lcname, o);
@ -828,7 +845,7 @@ void writeRustInterface(const Configuration& conf) {
r << QString(R"(/* generated by rust_qt_binding_generator */ r << QString(R"(/* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;

View File

@ -155,6 +155,11 @@ struct Configuration {
QList<QString> optionalTypes() const { QList<QString> optionalTypes() const {
QList<QString> ops; QList<QString> ops;
for (auto o: objects) { for (auto o: objects) {
for (auto ip: o.properties) {
if (ip.optional && !ops.contains(ip.type.name)) {
ops.append(ip.type.name);
}
}
for (auto ip: o.itemProperties) { for (auto ip: o.itemProperties) {
if (ip.optional && !ops.contains(ip.type.name)) { if (ip.optional && !ops.contains(ip.type.name)) {
ops.append(ip.type.name); ops.append(ip.type.name);

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;
@ -123,8 +123,8 @@ pub trait PersonsTrait {
fn new(emit: PersonsEmitter, model: PersonsList) -> Self; fn new(emit: PersonsEmitter, model: PersonsList) -> Self;
fn emit(&self) -> &PersonsEmitter; fn emit(&self) -> &PersonsEmitter;
fn row_count(&self) -> usize; fn row_count(&self) -> usize;
fn insert_rows(&mut self, row: usize, count: usize) -> bool { false } fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn remove_rows(&mut self, row: usize, count: usize) -> bool { false } fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn can_fetch_more(&self) -> bool { fn can_fetch_more(&self) -> bool {
false false
} }

View File

@ -6,6 +6,7 @@ use interface::*;
#[derive(Default, Clone)] #[derive(Default, Clone)]
struct ListItem { struct ListItem {
boolean: bool, boolean: bool,
optional_boolean: Option<bool>,
i8: i8, i8: i8,
u8: u8, u8: u8,
i16: i16, i16: i16,
@ -49,6 +50,13 @@ impl ListTrait for List {
self.list[item].boolean = v; self.list[item].boolean = v;
true true
} }
fn optional_boolean(&self, item: usize) -> Option<bool> {
self.list[item].optional_boolean
}
fn set_optional_boolean(&mut self, item: usize, v: Option<bool>) -> bool {
self.list[item].optional_boolean = v;
true
}
fn i8(&self, item: usize) -> i8 { fn i8(&self, item: usize) -> i8 {
self.list[item].i8 self.list[item].i8
} }

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;
@ -126,8 +126,8 @@ pub trait ListTrait {
fn new(emit: ListEmitter, model: ListList) -> Self; fn new(emit: ListEmitter, model: ListList) -> Self;
fn emit(&self) -> &ListEmitter; fn emit(&self) -> &ListEmitter;
fn row_count(&self) -> usize; fn row_count(&self) -> usize;
fn insert_rows(&mut self, row: usize, count: usize) -> bool { false } fn insert_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn remove_rows(&mut self, row: usize, count: usize) -> bool { false } fn remove_rows(&mut self, _row: usize, _count: usize) -> bool { false }
fn can_fetch_more(&self) -> bool { fn can_fetch_more(&self) -> bool {
false false
} }
@ -149,6 +149,8 @@ pub trait ListTrait {
fn set_i64(&mut self, item: usize, i64) -> bool; fn set_i64(&mut self, item: usize, i64) -> bool;
fn i8(&self, item: usize) -> i8; fn i8(&self, item: usize) -> i8;
fn set_i8(&mut self, item: usize, i8) -> bool; fn set_i8(&mut self, item: usize, i8) -> bool;
fn optional_boolean(&self, item: usize) -> Option<bool>;
fn set_optional_boolean(&mut self, item: usize, Option<bool>) -> bool;
fn optional_bytearray(&self, item: usize) -> Option<&[u8]>; fn optional_bytearray(&self, item: usize) -> Option<&[u8]>;
fn set_optional_bytearray(&mut self, item: usize, Option<Vec<u8>>) -> bool; fn set_optional_bytearray(&mut self, item: usize, Option<Vec<u8>>) -> bool;
fn optional_string(&self, item: usize) -> Option<&str>; fn optional_string(&self, item: usize) -> Option<&str>;
@ -351,6 +353,25 @@ pub unsafe extern "C" fn list_set_data_i8(
(&mut *ptr).set_i8(row as usize, v) (&mut *ptr).set_i8(row as usize, v)
} }
#[no_mangle]
pub extern "C" fn list_data_optional_boolean(ptr: *const List, row: c_int) -> COption<bool> {
let o = unsafe { &*ptr };
o.optional_boolean(row as usize).into()
}
#[no_mangle]
pub unsafe extern "C" fn list_set_data_optional_boolean(
ptr: *mut List, row: c_int,
v: bool,
) -> bool {
(&mut *ptr).set_optional_boolean(row as usize, Some(v))
}
#[no_mangle]
pub unsafe extern "C" fn list_set_data_optional_boolean_none(ptr: *mut List, row: c_int) -> bool {
(&mut *ptr).set_optional_boolean(row as usize, None)
}
#[no_mangle] #[no_mangle]
pub extern "C" fn list_data_optional_bytearray( pub extern "C" fn list_data_optional_bytearray(
ptr: *const List, row: c_int, ptr: *const List, row: c_int,

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;

View File

@ -6,6 +6,7 @@ use interface::*;
pub struct Object { pub struct Object {
emit: ObjectEmitter, emit: ObjectEmitter,
boolean: bool, boolean: bool,
optional_boolean: Option<bool>,
i8: i8, i8: i8,
u8: u8, u8: u8,
i16: i16, i16: i16,
@ -14,6 +15,7 @@ pub struct Object {
u32: u32, u32: u32,
i64: i64, i64: i64,
u64: u64, u64: u64,
optional_u64: Option<u64>,
f32: f32, f32: f32,
f64: f64, f64: f64,
bytearray: Vec<u8>, bytearray: Vec<u8>,
@ -27,6 +29,7 @@ impl ObjectTrait for Object {
Object { Object {
emit, emit,
boolean: false, boolean: false,
optional_boolean: None,
i8: 0, i8: 0,
u8: 0, u8: 0,
i16: 0, i16: 0,
@ -35,6 +38,7 @@ impl ObjectTrait for Object {
u32: 0, u32: 0,
i64: 0, i64: 0,
u64: 0, u64: 0,
optional_u64: None,
f32: 0., f32: 0.,
f64: 0., f64: 0.,
bytearray: Vec::new(), bytearray: Vec::new(),
@ -53,6 +57,13 @@ impl ObjectTrait for Object {
self.boolean = value; self.boolean = value;
self.emit.boolean_changed(); self.emit.boolean_changed();
} }
fn optional_boolean(&self) -> Option<bool> {
self.optional_boolean
}
fn set_optional_boolean(&mut self, b: Option<bool>) {
self.optional_boolean = b;
self.emit.optional_boolean_changed();
}
fn i8(&self) -> i8 { fn i8(&self) -> i8 {
self.i8 self.i8
} }
@ -109,6 +120,13 @@ impl ObjectTrait for Object {
self.u64 = value; self.u64 = value;
self.emit.u64_changed(); self.emit.u64_changed();
} }
fn optional_u64(&self) -> Option<u64> {
self.optional_u64
}
fn set_optional_u64(&mut self, v: Option<u64>) {
self.optional_u64 = v;
self.emit.optional_u64_changed();
}
fn f32(&self) -> f32 { fn f32(&self) -> f32 {
self.f32 self.f32
} }
@ -123,14 +141,6 @@ impl ObjectTrait for Object {
self.f64 = value; self.f64 = value;
self.emit.f64_changed(); self.emit.f64_changed();
} }
/*
fn optional_boolean(&self) -> Option<bool> {
self.optional_boolean
}
fn set_optional_boolean(&mut self, b: Option<bool>) {
self.optional_boolean = b;
}
*/
fn bytearray(&self) -> &[u8] { fn bytearray(&self) -> &[u8] {
&self.bytearray &self.bytearray
} }

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;
@ -65,8 +65,10 @@ pub struct ObjectEmitter {
i32_changed: fn(*const ObjectQObject), i32_changed: fn(*const ObjectQObject),
i64_changed: fn(*const ObjectQObject), i64_changed: fn(*const ObjectQObject),
i8_changed: fn(*const ObjectQObject), i8_changed: fn(*const ObjectQObject),
optional_boolean_changed: fn(*const ObjectQObject),
optional_bytearray_changed: fn(*const ObjectQObject), optional_bytearray_changed: fn(*const ObjectQObject),
optional_string_changed: fn(*const ObjectQObject), optional_string_changed: fn(*const ObjectQObject),
optional_u64_changed: fn(*const ObjectQObject),
string_changed: fn(*const ObjectQObject), string_changed: fn(*const ObjectQObject),
u16_changed: fn(*const ObjectQObject), u16_changed: fn(*const ObjectQObject),
u32_changed: fn(*const ObjectQObject), u32_changed: fn(*const ObjectQObject),
@ -128,6 +130,12 @@ impl ObjectEmitter {
(self.i8_changed)(ptr); (self.i8_changed)(ptr);
} }
} }
pub fn optional_boolean_changed(&self) {
let ptr = *self.qobject.lock().unwrap();
if !ptr.is_null() {
(self.optional_boolean_changed)(ptr);
}
}
pub fn optional_bytearray_changed(&self) { pub fn optional_bytearray_changed(&self) {
let ptr = *self.qobject.lock().unwrap(); let ptr = *self.qobject.lock().unwrap();
if !ptr.is_null() { if !ptr.is_null() {
@ -140,6 +148,12 @@ impl ObjectEmitter {
(self.optional_string_changed)(ptr); (self.optional_string_changed)(ptr);
} }
} }
pub fn optional_u64_changed(&self) {
let ptr = *self.qobject.lock().unwrap();
if !ptr.is_null() {
(self.optional_u64_changed)(ptr);
}
}
pub fn string_changed(&self) { pub fn string_changed(&self) {
let ptr = *self.qobject.lock().unwrap(); let ptr = *self.qobject.lock().unwrap();
if !ptr.is_null() { if !ptr.is_null() {
@ -191,10 +205,14 @@ pub trait ObjectTrait {
fn set_i64(&mut self, value: i64); fn set_i64(&mut self, value: i64);
fn i8(&self) -> i8; fn i8(&self) -> i8;
fn set_i8(&mut self, value: i8); fn set_i8(&mut self, value: i8);
fn optional_boolean(&self) -> Option<bool>;
fn set_optional_boolean(&mut self, value: Option<bool>);
fn optional_bytearray(&self) -> Option<&[u8]>; fn optional_bytearray(&self) -> Option<&[u8]>;
fn set_optional_bytearray(&mut self, value: Option<Vec<u8>>); fn set_optional_bytearray(&mut self, value: Option<Vec<u8>>);
fn optional_string(&self) -> Option<&str>; fn optional_string(&self) -> Option<&str>;
fn set_optional_string(&mut self, value: Option<String>); fn set_optional_string(&mut self, value: Option<String>);
fn optional_u64(&self) -> Option<u64>;
fn set_optional_u64(&mut self, value: Option<u64>);
fn string(&self) -> &str; fn string(&self) -> &str;
fn set_string(&mut self, value: String); fn set_string(&mut self, value: String);
fn u16(&self) -> u16; fn u16(&self) -> u16;
@ -218,8 +236,10 @@ pub extern "C" fn object_new(
i32_changed: fn(*const ObjectQObject), i32_changed: fn(*const ObjectQObject),
i64_changed: fn(*const ObjectQObject), i64_changed: fn(*const ObjectQObject),
i8_changed: fn(*const ObjectQObject), i8_changed: fn(*const ObjectQObject),
optional_boolean_changed: fn(*const ObjectQObject),
optional_bytearray_changed: fn(*const ObjectQObject), optional_bytearray_changed: fn(*const ObjectQObject),
optional_string_changed: fn(*const ObjectQObject), optional_string_changed: fn(*const ObjectQObject),
optional_u64_changed: fn(*const ObjectQObject),
string_changed: fn(*const ObjectQObject), string_changed: fn(*const ObjectQObject),
u16_changed: fn(*const ObjectQObject), u16_changed: fn(*const ObjectQObject),
u32_changed: fn(*const ObjectQObject), u32_changed: fn(*const ObjectQObject),
@ -236,8 +256,10 @@ pub extern "C" fn object_new(
i32_changed: i32_changed, i32_changed: i32_changed,
i64_changed: i64_changed, i64_changed: i64_changed,
i8_changed: i8_changed, i8_changed: i8_changed,
optional_boolean_changed: optional_boolean_changed,
optional_bytearray_changed: optional_bytearray_changed, optional_bytearray_changed: optional_bytearray_changed,
optional_string_changed: optional_string_changed, optional_string_changed: optional_string_changed,
optional_u64_changed: optional_u64_changed,
string_changed: string_changed, string_changed: string_changed,
u16_changed: u16_changed, u16_changed: u16_changed,
u32_changed: u32_changed, u32_changed: u32_changed,
@ -342,6 +364,25 @@ pub unsafe extern "C" fn object_i8_set(ptr: *mut Object, v: i8) {
(&mut *ptr).set_i8(v); (&mut *ptr).set_i8(v);
} }
#[no_mangle]
pub unsafe extern "C" fn object_optional_boolean_get(ptr: *const Object) -> COption<bool> {
match (&*ptr).optional_boolean() {
Some(value) => COption { data: value, some: true },
None => COption { data: bool::default(), some: false}
}
}
#[no_mangle]
pub unsafe extern "C" fn object_optional_boolean_set(ptr: *mut Object, v: bool) {
(&mut *ptr).set_optional_boolean(Some(v));
}
#[no_mangle]
pub extern "C" fn object_optional_boolean_set_none(ptr: *mut Object) {
let o = unsafe { &mut *ptr };
o.set_optional_boolean(None);
}
#[no_mangle] #[no_mangle]
pub extern "C" fn object_optional_bytearray_get( pub extern "C" fn object_optional_bytearray_get(
ptr: *const Object, ptr: *const Object,
@ -362,6 +403,7 @@ pub extern "C" fn object_optional_bytearray_set(ptr: *mut Object, v: *const c_ch
let v = unsafe { slice::from_raw_parts(v as *const u8, len as usize) }; let v = unsafe { slice::from_raw_parts(v as *const u8, len as usize) };
o.set_optional_bytearray(Some(v.into())); o.set_optional_bytearray(Some(v.into()));
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn object_optional_bytearray_set_none(ptr: *mut Object) { pub extern "C" fn object_optional_bytearray_set_none(ptr: *mut Object) {
let o = unsafe { &mut *ptr }; let o = unsafe { &mut *ptr };
@ -389,12 +431,32 @@ pub extern "C" fn object_optional_string_set(ptr: *mut Object, v: *const c_ushor
set_string_from_utf16(&mut s, v, len); set_string_from_utf16(&mut s, v, len);
o.set_optional_string(Some(s)); o.set_optional_string(Some(s));
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn object_optional_string_set_none(ptr: *mut Object) { pub extern "C" fn object_optional_string_set_none(ptr: *mut Object) {
let o = unsafe { &mut *ptr }; let o = unsafe { &mut *ptr };
o.set_optional_string(None); o.set_optional_string(None);
} }
#[no_mangle]
pub unsafe extern "C" fn object_optional_u64_get(ptr: *const Object) -> COption<u64> {
match (&*ptr).optional_u64() {
Some(value) => COption { data: value, some: true },
None => COption { data: u64::default(), some: false}
}
}
#[no_mangle]
pub unsafe extern "C" fn object_optional_u64_set(ptr: *mut Object, v: u64) {
(&mut *ptr).set_optional_u64(Some(v));
}
#[no_mangle]
pub extern "C" fn object_optional_u64_set_none(ptr: *mut Object) {
let o = unsafe { &mut *ptr };
o.set_optional_u64(None);
}
#[no_mangle] #[no_mangle]
pub extern "C" fn object_string_get( pub extern "C" fn object_string_get(
ptr: *const Object, ptr: *const Object,

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;

View File

@ -1,7 +1,7 @@
/* generated by rust_qt_binding_generator */ /* generated by rust_qt_binding_generator */
#![allow(unknown_lints)] #![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)] #![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t}; use libc::{c_char, c_ushort, c_int, c_void};
use std::slice; use std::slice;
use std::char::decode_utf16; use std::char::decode_utf16;

View File

@ -30,6 +30,7 @@ private slots:
void testStringGetter(); void testStringGetter();
void testStringSetter(); void testStringSetter();
void testBool(); void testBool();
void testOptionalBool();
void testInt8(); void testInt8();
void testUint8(); void testUint8();
void testInt16(); void testInt16();
@ -53,6 +54,26 @@ void testSetter(const V v, Set set, Get get)
List list; List list;
QSignalSpy spy(&list, &List::dataChanged); QSignalSpy spy(&list, &List::dataChanged);
// WHEN
const QVariant vv = QVariant::fromValue(v);
QVERIFY(!vv.isNull());
bool ok = (list.*set)(0, vv);
QVERIFY(ok);
// THEN
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QCOMPARE((list.*get)(0), vv);
}
template <typename V, typename Set, typename Get>
void testOptionalSetter(const V v, Set set, Get get)
{
// GIVEN
List list;
QSignalSpy spy(&list, &List::dataChanged);
QVERIFY((list.*get)(0).isNull());
// WHEN // WHEN
QVariant vv = QVariant::fromValue(v); QVariant vv = QVariant::fromValue(v);
if (vv.isNull()) { if (vv.isNull()) {
@ -90,6 +111,28 @@ void testDataSetter(const char* roleName, const V v)
// WHEN // WHEN
int role = getRoleFromName(list, roleName); int role = getRoleFromName(list, roleName);
auto index = list.index(1, 0); auto index = list.index(1, 0);
const QVariant vv = QVariant::fromValue(v);
QVERIFY(!vv.isNull());
bool ok = list.setData(index, vv, role);
QVERIFY(ok);
// THEN
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QCOMPARE(list.data(index, role), vv);
}
template <typename V>
void testOptionalDataSetter(const char* roleName, const V v)
{
// GIVEN
List list;
QSignalSpy spy(&list, &List::dataChanged);
int role = getRoleFromName(list, roleName);
auto index = list.index(1, 0);
QVERIFY(list.data(index, role).isNull());
// WHEN
QVariant vv = QVariant::fromValue(v); QVariant vv = QVariant::fromValue(v);
if (vv.isNull()) { if (vv.isNull()) {
vv = QVariant(); vv = QVariant();
@ -107,7 +150,14 @@ template <typename V, typename Set, typename Get>
void test(const V v, Set set, Get get, const char* roleName) void test(const V v, Set set, Get get, const char* roleName)
{ {
testSetter(v, set, get); testSetter(v, set, get);
//testDataSetter(roleName, v); testDataSetter(roleName, v);
}
template <typename V, typename Set, typename Get>
void testOptional(const V v, Set set, Get get, const char* roleName)
{
testOptionalSetter(v, set, get);
testOptionalDataSetter(roleName, v);
} }
void TestRustListTypes::testConstructor() void TestRustListTypes::testConstructor()
@ -121,6 +171,14 @@ void TestRustListTypes::testBool()
test(false, &List::setBoolean, &List::boolean, "boolean"); test(false, &List::setBoolean, &List::boolean, "boolean");
} }
void TestRustListTypes::testOptionalBool()
{
testOptional(true, &List::setOptionalBoolean, &List::optionalBoolean,
"optionalBoolean");
testOptional(false, &List::setOptionalBoolean, &List::optionalBoolean,
"optionalBoolean");
}
void TestRustListTypes::testInt8() void TestRustListTypes::testInt8()
{ {
test(0, &List::setI8, &List::i8, "i8"); test(0, &List::setI8, &List::i8, "i8");
@ -210,14 +268,14 @@ void TestRustListTypes::testString()
void TestRustListTypes::testOptionalString() void TestRustListTypes::testOptionalString()
{ {
test(QString(), &List::setOptionalString, &List::optionalString, testOptional(QString(), &List::setOptionalString, &List::optionalString,
"optionalString"); "optionalString");
test(QString(""), &List::setOptionalString, &List::optionalString, testOptional(QString(""), &List::setOptionalString, &List::optionalString,
"optionalString");
test(QString("Konqi"), &List::setOptionalString, &List::optionalString,
"optionalString");
test(QString("$𐐷𤭢"), &List::setOptionalString, &List::optionalString,
"optionalString"); "optionalString");
testOptional(QString("Konqi"), &List::setOptionalString,
&List::optionalString, "optionalString");
testOptional(QString("$𐐷𤭢"), &List::setOptionalString,
&List::optionalString, "optionalString");
} }
void TestRustListTypes::testByteArray() void TestRustListTypes::testByteArray()
@ -231,16 +289,15 @@ void TestRustListTypes::testByteArray()
void TestRustListTypes::testOptionalByteArray() void TestRustListTypes::testOptionalByteArray()
{ {
test(QByteArray(), &List::setOptionalBytearray, &List::optionalBytearray, testOptional(QByteArray(), &List::setOptionalBytearray,
"optionalBytearray"); &List::optionalBytearray, "optionalBytearray");
const char data[10] = {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9}; const char data[10] = {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9};
test(QByteArray(data, 0), &List::setOptionalBytearray, testOptional(QByteArray(data, 0), &List::setOptionalBytearray,
&List::optionalBytearray, "optionalBytearray"); &List::optionalBytearray, "optionalBytearray");
test(QByteArray(data, 10), &List::setOptionalBytearray, testOptional(QByteArray(data, 10), &List::setOptionalBytearray,
&List::optionalBytearray, "optionalBytearray"); &List::optionalBytearray, "optionalBytearray");
} }
void TestRustListTypes::testStringGetter() void TestRustListTypes::testStringGetter()
{ {
List list; List list;

View File

@ -13,6 +13,11 @@
"type": "bool", "type": "bool",
"write": true "write": true
}, },
"optionalBoolean": {
"optional": true,
"type": "bool",
"write": true
},
"i8": { "i8": {
"type": "qint8", "type": "qint8",
"write": true "write": true

View File

@ -3,6 +3,19 @@
namespace { namespace {
struct option_bool {
public:
bool value;
bool some;
operator QVariant() const {
if (some) {
return QVariant::fromValue(value);
}
return QVariant();
}
};
static_assert(std::is_pod<option_bool>::value, "option_bool must be a POD type.");
struct option_quintptr { struct option_quintptr {
public: public:
quintptr value; quintptr value;
@ -53,6 +66,9 @@ extern "C" {
bool list_set_data_i64(List::Private*, int, qint64); bool list_set_data_i64(List::Private*, int, qint64);
qint8 list_data_i8(const List::Private*, int); qint8 list_data_i8(const List::Private*, int);
bool list_set_data_i8(List::Private*, int, qint8); bool list_set_data_i8(List::Private*, int, qint8);
option_bool list_data_optional_boolean(const List::Private*, int);
bool list_set_data_optional_boolean(List::Private*, int, bool);
bool list_set_data_optional_boolean_none(List::Private*, int);
void list_data_optional_bytearray(const List::Private*, int, QByteArray*, qbytearray_set); void list_data_optional_bytearray(const List::Private*, int, QByteArray*, qbytearray_set);
bool list_set_data_optional_bytearray(List::Private*, int, const char* s, int len); bool list_set_data_optional_bytearray(List::Private*, int, const char* s, int len);
bool list_set_data_optional_bytearray_none(List::Private*, int); bool list_set_data_optional_bytearray_none(List::Private*, int);
@ -311,6 +327,31 @@ bool List::setI8(int row, const QVariant& value)
return set; return set;
} }
QVariant List::optionalBoolean(int row) const
{
QVariant v;
v = list_data_optional_boolean(m_d, row);
return v;
}
bool List::setOptionalBoolean(int row, const QVariant& value)
{
bool set = false;
if (!value.isValid()) {
set = list_set_data_optional_boolean_none(m_d, row);
} else {
if (!value.canConvert(qMetaTypeId<bool>())) {
return false;
}
set = list_set_data_optional_boolean(m_d, row, value.value<bool>());
}
if (set) {
QModelIndex index = createIndex(row, 0, row);
emit dataChanged(index, index);
}
return set;
}
QVariant List::optionalBytearray(int row) const QVariant List::optionalBytearray(int row) const
{ {
QVariant v; QVariant v;
@ -498,20 +539,22 @@ QVariant List::data(const QModelIndex &index, int role) const
case Qt::UserRole + 7: case Qt::UserRole + 7:
return i8(index.row()); return i8(index.row());
case Qt::UserRole + 8: case Qt::UserRole + 8:
return optionalBytearray(index.row()); return optionalBoolean(index.row());
case Qt::UserRole + 9: case Qt::UserRole + 9:
return optionalBytearray(index.row());
case Qt::UserRole + 10:
return optionalString(index.row()); return optionalString(index.row());
case Qt::DisplayRole: case Qt::DisplayRole:
case Qt::EditRole: case Qt::EditRole:
case Qt::UserRole + 10:
return string(index.row());
case Qt::UserRole + 11: case Qt::UserRole + 11:
return u16(index.row()); return string(index.row());
case Qt::UserRole + 12: case Qt::UserRole + 12:
return u32(index.row()); return u16(index.row());
case Qt::UserRole + 13: case Qt::UserRole + 13:
return u64(index.row()); return u32(index.row());
case Qt::UserRole + 14: case Qt::UserRole + 14:
return u64(index.row());
case Qt::UserRole + 15:
return u8(index.row()); return u8(index.row());
} }
} }
@ -528,13 +571,14 @@ QHash<int, QByteArray> List::roleNames() const {
names.insert(Qt::UserRole + 5, "i32"); names.insert(Qt::UserRole + 5, "i32");
names.insert(Qt::UserRole + 6, "i64"); names.insert(Qt::UserRole + 6, "i64");
names.insert(Qt::UserRole + 7, "i8"); names.insert(Qt::UserRole + 7, "i8");
names.insert(Qt::UserRole + 8, "optionalBytearray"); names.insert(Qt::UserRole + 8, "optionalBoolean");
names.insert(Qt::UserRole + 9, "optionalString"); names.insert(Qt::UserRole + 9, "optionalBytearray");
names.insert(Qt::UserRole + 10, "string"); names.insert(Qt::UserRole + 10, "optionalString");
names.insert(Qt::UserRole + 11, "u16"); names.insert(Qt::UserRole + 11, "string");
names.insert(Qt::UserRole + 12, "u32"); names.insert(Qt::UserRole + 12, "u16");
names.insert(Qt::UserRole + 13, "u64"); names.insert(Qt::UserRole + 13, "u32");
names.insert(Qt::UserRole + 14, "u8"); names.insert(Qt::UserRole + 14, "u64");
names.insert(Qt::UserRole + 15, "u8");
return names; return names;
} }
QVariant List::headerData(int section, Qt::Orientation orientation, int role) const QVariant List::headerData(int section, Qt::Orientation orientation, int role) const
@ -582,24 +626,27 @@ bool List::setData(const QModelIndex &index, const QVariant &value, int role)
return setI8(index.row(), value); return setI8(index.row(), value);
} }
if (role == Qt::UserRole + 8) { if (role == Qt::UserRole + 8) {
return setOptionalBytearray(index.row(), value); return setOptionalBoolean(index.row(), value);
} }
if (role == Qt::UserRole + 9) { if (role == Qt::UserRole + 9) {
return setOptionalBytearray(index.row(), value);
}
if (role == Qt::UserRole + 10) {
return setOptionalString(index.row(), value); return setOptionalString(index.row(), value);
} }
if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole + 10) { if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole + 11) {
return setString(index.row(), value); return setString(index.row(), value);
} }
if (role == Qt::UserRole + 11) { if (role == Qt::UserRole + 12) {
return setU16(index.row(), value); return setU16(index.row(), value);
} }
if (role == Qt::UserRole + 12) { if (role == Qt::UserRole + 13) {
return setU32(index.row(), value); return setU32(index.row(), value);
} }
if (role == Qt::UserRole + 13) { if (role == Qt::UserRole + 14) {
return setU64(index.row(), value); return setU64(index.row(), value);
} }
if (role == Qt::UserRole + 14) { if (role == Qt::UserRole + 15) {
return setU8(index.row(), value); return setU8(index.row(), value);
} }
} }

View File

@ -52,6 +52,8 @@ public:
Q_INVOKABLE bool setI64(int row, const QVariant& value); Q_INVOKABLE bool setI64(int row, const QVariant& value);
Q_INVOKABLE QVariant i8(int row) const; Q_INVOKABLE QVariant i8(int row) const;
Q_INVOKABLE bool setI8(int row, const QVariant& value); Q_INVOKABLE bool setI8(int row, const QVariant& value);
Q_INVOKABLE QVariant optionalBoolean(int row) const;
Q_INVOKABLE bool setOptionalBoolean(int row, const QVariant& value);
Q_INVOKABLE QVariant optionalBytearray(int row) const; Q_INVOKABLE QVariant optionalBytearray(int row) const;
Q_INVOKABLE bool setOptionalBytearray(int row, const QVariant& value); Q_INVOKABLE bool setOptionalBytearray(int row, const QVariant& value);
Q_INVOKABLE QVariant optionalString(int row) const; Q_INVOKABLE QVariant optionalString(int row) const;

View File

@ -8,6 +8,7 @@ class TestRustObjectTypes : public QObject
Q_OBJECT Q_OBJECT
private slots: private slots:
void testBool(); void testBool();
void testOptionalBool();
void testInt8(); void testInt8();
void testUint8(); void testUint8();
void testInt16(); void testInt16();
@ -16,6 +17,7 @@ private slots:
void testUint32(); void testUint32();
void testInt64(); void testInt64();
void testUint64(); void testUint64();
void testOptionalUint64();
void testFloat(); void testFloat();
void testDouble(); void testDouble();
void testString(); void testString();
@ -48,6 +50,16 @@ void TestRustObjectTypes::testBool()
&Object::boolean, &Object::booleanChanged); &Object::boolean, &Object::booleanChanged);
} }
void TestRustObjectTypes::testOptionalBool()
{
testSetter(QVariant(), &Object::setOptionalBoolean,
&Object::optionalBoolean, &Object::optionalBooleanChanged);
testSetter(QVariant::fromValue(true), &Object::setOptionalBoolean,
&Object::optionalBoolean, &Object::optionalBooleanChanged);
testSetter(QVariant::fromValue(false), &Object::setOptionalBoolean,
&Object::optionalBoolean, &Object::optionalBooleanChanged);
}
void TestRustObjectTypes::testInt8() void TestRustObjectTypes::testInt8()
{ {
testSetter(0, &Object::setI8, testSetter(0, &Object::setI8,
@ -144,6 +156,22 @@ void TestRustObjectTypes::testUint64()
&Object::u64, &Object::u64Changed); &Object::u64, &Object::u64Changed);
} }
void TestRustObjectTypes::testOptionalUint64()
{
testSetter(QVariant(), &Object::setOptionalU64,
&Object::optionalU64, &Object::optionalU64Changed);
testSetter(QVariant::fromValue(0), &Object::setOptionalU64,
&Object::optionalU64, &Object::optionalU64Changed);
testSetter(QVariant::fromValue(1), &Object::setOptionalU64,
&Object::optionalU64, &Object::optionalU64Changed);
testSetter(QVariant::fromValue(std::numeric_limits<uint64_t>::min()),
&Object::setOptionalU64, &Object::optionalU64,
&Object::optionalU64Changed);
testSetter(QVariant::fromValue(std::numeric_limits<uint64_t>::max()),
&Object::setOptionalU64, &Object::optionalU64,
&Object::optionalU64Changed);
}
void TestRustObjectTypes::testFloat() void TestRustObjectTypes::testFloat()
{ {
testSetter(0, &Object::setF32, testSetter(0, &Object::setF32,

View File

@ -13,6 +13,11 @@
"type": "bool", "type": "bool",
"write": true "write": true
}, },
"optionalBoolean": {
"optional": true,
"type": "bool",
"write": true
},
"i8": { "i8": {
"type": "qint8", "type": "qint8",
"write": true "write": true
@ -45,6 +50,11 @@
"type": "quint64", "type": "quint64",
"write": true "write": true
}, },
"optionalU64": {
"optional": true,
"type": "quint64",
"write": true
},
"f32": { "f32": {
"type": "float", "type": "float",
"write": true "write": true

View File

@ -3,6 +3,32 @@
namespace { namespace {
struct option_bool {
public:
bool value;
bool some;
operator QVariant() const {
if (some) {
return QVariant::fromValue(value);
}
return QVariant();
}
};
static_assert(std::is_pod<option_bool>::value, "option_bool must be a POD type.");
struct option_quint64 {
public:
quint64 value;
bool some;
operator QVariant() const {
if (some) {
return QVariant::fromValue(value);
}
return QVariant();
}
};
static_assert(std::is_pod<option_quint64>::value, "option_quint64 must be a POD type.");
typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes); typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes);
void set_qstring(QString* val, const char* utf8, int nbytes) { void set_qstring(QString* val, const char* utf8, int nbytes) {
*val = QString::fromUtf8(utf8, nbytes); *val = QString::fromUtf8(utf8, nbytes);
@ -49,6 +75,10 @@ namespace {
{ {
emit o->i8Changed(); emit o->i8Changed();
} }
inline void objectOptionalBooleanChanged(Object* o)
{
emit o->optionalBooleanChanged();
}
inline void objectOptionalBytearrayChanged(Object* o) inline void objectOptionalBytearrayChanged(Object* o)
{ {
emit o->optionalBytearrayChanged(); emit o->optionalBytearrayChanged();
@ -57,6 +87,10 @@ namespace {
{ {
emit o->optionalStringChanged(); emit o->optionalStringChanged();
} }
inline void objectOptionalU64Changed(Object* o)
{
emit o->optionalU64Changed();
}
inline void objectStringChanged(Object* o) inline void objectStringChanged(Object* o)
{ {
emit o->stringChanged(); emit o->stringChanged();
@ -79,7 +113,7 @@ namespace {
} }
} }
extern "C" { extern "C" {
Object::Private* object_new(Object*, void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*)); Object::Private* object_new(Object*, void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*), void (*)(Object*));
void object_free(Object::Private*); void object_free(Object::Private*);
bool object_boolean_get(const Object::Private*); bool object_boolean_get(const Object::Private*);
void object_boolean_set(Object::Private*, bool); void object_boolean_set(Object::Private*, bool);
@ -97,12 +131,18 @@ extern "C" {
void object_i64_set(Object::Private*, qint64); void object_i64_set(Object::Private*, qint64);
qint8 object_i8_get(const Object::Private*); qint8 object_i8_get(const Object::Private*);
void object_i8_set(Object::Private*, qint8); void object_i8_set(Object::Private*, qint8);
option_bool object_optional_boolean_get(const Object::Private*);
void object_optional_boolean_set(Object::Private*, bool);
void object_optional_boolean_set_none(Object::Private*);
void object_optional_bytearray_get(const Object::Private*, QByteArray*, qbytearray_set); void object_optional_bytearray_get(const Object::Private*, QByteArray*, qbytearray_set);
void object_optional_bytearray_set(Object::Private*, const char* bytes, int len); void object_optional_bytearray_set(Object::Private*, const char* bytes, int len);
void object_optional_bytearray_set_none(Object::Private*); void object_optional_bytearray_set_none(Object::Private*);
void object_optional_string_get(const Object::Private*, QString*, qstring_set); void object_optional_string_get(const Object::Private*, QString*, qstring_set);
void object_optional_string_set(Object::Private*, const ushort *str, int len); void object_optional_string_set(Object::Private*, const ushort *str, int len);
void object_optional_string_set_none(Object::Private*); void object_optional_string_set_none(Object::Private*);
option_quint64 object_optional_u64_get(const Object::Private*);
void object_optional_u64_set(Object::Private*, quint64);
void object_optional_u64_set_none(Object::Private*);
void object_string_get(const Object::Private*, QString*, qstring_set); void object_string_get(const Object::Private*, QString*, qstring_set);
void object_string_set(Object::Private*, const ushort *str, int len); void object_string_set(Object::Private*, const ushort *str, int len);
quint16 object_u16_get(const Object::Private*); quint16 object_u16_get(const Object::Private*);
@ -133,8 +173,10 @@ Object::Object(QObject *parent):
objectI32Changed, objectI32Changed,
objectI64Changed, objectI64Changed,
objectI8Changed, objectI8Changed,
objectOptionalBooleanChanged,
objectOptionalBytearrayChanged, objectOptionalBytearrayChanged,
objectOptionalStringChanged, objectOptionalStringChanged,
objectOptionalU64Changed,
objectStringChanged, objectStringChanged,
objectU16Changed, objectU16Changed,
objectU32Changed, objectU32Changed,
@ -207,6 +249,22 @@ qint8 Object::i8() const
void Object::setI8(qint8 v) { void Object::setI8(qint8 v) {
object_i8_set(m_d, v); object_i8_set(m_d, v);
} }
QVariant Object::optionalBoolean() const
{
QVariant v;
auto r = object_optional_boolean_get(m_d);
if (r.some) {
v.setValue(r.value);
}
return r;
}
void Object::setOptionalBoolean(const QVariant& v) {
if (v.isNull() || !v.canConvert<bool>()) {
object_optional_boolean_set_none(m_d);
} else {
object_optional_boolean_set(m_d, v.value<bool>());
}
}
QByteArray Object::optionalBytearray() const QByteArray Object::optionalBytearray() const
{ {
QByteArray v; QByteArray v;
@ -233,6 +291,22 @@ void Object::setOptionalString(const QString& v) {
object_optional_string_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size()); object_optional_string_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size());
} }
} }
QVariant Object::optionalU64() const
{
QVariant v;
auto r = object_optional_u64_get(m_d);
if (r.some) {
v.setValue(r.value);
}
return r;
}
void Object::setOptionalU64(const QVariant& v) {
if (v.isNull() || !v.canConvert<quint64>()) {
object_optional_u64_set_none(m_d);
} else {
object_optional_u64_set(m_d, v.value<quint64>());
}
}
QString Object::string() const QString Object::string() const
{ {
QString v; QString v;

View File

@ -23,8 +23,10 @@ private:
Q_PROPERTY(qint32 i32 READ i32 WRITE setI32 NOTIFY i32Changed FINAL) Q_PROPERTY(qint32 i32 READ i32 WRITE setI32 NOTIFY i32Changed FINAL)
Q_PROPERTY(qint64 i64 READ i64 WRITE setI64 NOTIFY i64Changed FINAL) Q_PROPERTY(qint64 i64 READ i64 WRITE setI64 NOTIFY i64Changed FINAL)
Q_PROPERTY(qint8 i8 READ i8 WRITE setI8 NOTIFY i8Changed FINAL) Q_PROPERTY(qint8 i8 READ i8 WRITE setI8 NOTIFY i8Changed FINAL)
Q_PROPERTY(QVariant optionalBoolean READ optionalBoolean WRITE setOptionalBoolean NOTIFY optionalBooleanChanged FINAL)
Q_PROPERTY(QByteArray optionalBytearray READ optionalBytearray WRITE setOptionalBytearray NOTIFY optionalBytearrayChanged FINAL) Q_PROPERTY(QByteArray optionalBytearray READ optionalBytearray WRITE setOptionalBytearray NOTIFY optionalBytearrayChanged FINAL)
Q_PROPERTY(QString optionalString READ optionalString WRITE setOptionalString NOTIFY optionalStringChanged FINAL) Q_PROPERTY(QString optionalString READ optionalString WRITE setOptionalString NOTIFY optionalStringChanged FINAL)
Q_PROPERTY(QVariant optionalU64 READ optionalU64 WRITE setOptionalU64 NOTIFY optionalU64Changed FINAL)
Q_PROPERTY(QString string READ string WRITE setString NOTIFY stringChanged FINAL) Q_PROPERTY(QString string READ string WRITE setString NOTIFY stringChanged FINAL)
Q_PROPERTY(quint16 u16 READ u16 WRITE setU16 NOTIFY u16Changed FINAL) Q_PROPERTY(quint16 u16 READ u16 WRITE setU16 NOTIFY u16Changed FINAL)
Q_PROPERTY(quint32 u32 READ u32 WRITE setU32 NOTIFY u32Changed FINAL) Q_PROPERTY(quint32 u32 READ u32 WRITE setU32 NOTIFY u32Changed FINAL)
@ -50,10 +52,14 @@ public:
void setI64(qint64 v); void setI64(qint64 v);
qint8 i8() const; qint8 i8() const;
void setI8(qint8 v); void setI8(qint8 v);
QVariant optionalBoolean() const;
void setOptionalBoolean(const QVariant& v);
QByteArray optionalBytearray() const; QByteArray optionalBytearray() const;
void setOptionalBytearray(const QByteArray& v); void setOptionalBytearray(const QByteArray& v);
QString optionalString() const; QString optionalString() const;
void setOptionalString(const QString& v); void setOptionalString(const QString& v);
QVariant optionalU64() const;
void setOptionalU64(const QVariant& v);
QString string() const; QString string() const;
void setString(const QString& v); void setString(const QString& v);
quint16 u16() const; quint16 u16() const;
@ -73,8 +79,10 @@ signals:
void i32Changed(); void i32Changed();
void i64Changed(); void i64Changed();
void i8Changed(); void i8Changed();
void optionalBooleanChanged();
void optionalBytearrayChanged(); void optionalBytearrayChanged();
void optionalStringChanged(); void optionalStringChanged();
void optionalU64Changed();
void stringChanged(); void stringChanged();
void u16Changed(); void u16Changed();
void u32Changed(); void u32Changed();