Convert test_object

master
Jos van den Oever 2018-05-01 23:46:17 +02:00
parent f848b4f80f
commit fb6e2c933f
4 changed files with 63 additions and 120 deletions

View File

@ -22,6 +22,7 @@
#include "cpp.h"
#include "helper.h"
#include <QMetaEnum>
#include <QDebug>
template <typename T>
QString cppSetType(const T& p)
@ -679,8 +680,12 @@ void writeObjectCDecl(QTextStream& cpp, const Object& o, const Configuration& co
.arg(o.name, base, p.type.name) << endl;
}
if (p.write) {
QString t = p.type.cSetType;
if (t == "qstring_t") {
t = "const ushort *str, int len";
}
cpp << QString(" void %2_set(%1::Private*, %3);")
.arg(o.name, base, p.type.cSetType) << endl;
.arg(o.name, base, t) << endl;
if (p.optional) {
cpp << QString(" void %2_set_none(%1::Private*);")
.arg(o.name, base) << endl;
@ -831,7 +836,10 @@ void writeCppObject(QTextStream& cpp, const Object& o, const Configuration& conf
cpp << QString(" } else {") << endl;
cpp << QString(" %1_set(m_d, v);").arg(base) << endl;
cpp << QString(" }") << endl;
} else if (p.type.name == "QString") {
cpp << QString(" %1_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size());").arg(base) << endl;
} else {
qWarning() << p.type.cppSetType;
cpp << QString(" %1_set(m_d, v);").arg(base) << endl;
}
cpp << "}" << endl;
@ -916,22 +924,9 @@ namespace {
}
if (conf.types().contains("QString")) {
cpp << R"(
struct qstring_t {
private:
const void* data;
int len;
public:
qstring_t(const QString& v):
data(static_cast<const void*>(v.utf16())),
len(v.size()) {
}
operator QString() const {
return QString::fromUtf8(static_cast<const char*>(data), len);
}
};
typedef void (*qstring_set)(QString*, qstring_t*);
void set_qstring(QString* v, qstring_t* val) {
*v = *val;
typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes);
void set_qstring(QString* val, const char* utf8, int nbytes) {
*val = QString::fromUtf8(utf8, nbytes);
}
)";
}

View File

@ -360,22 +360,26 @@ pub unsafe extern "C" fn %2_get(ptr: *mut %1) -> *mut %4 {
} else if (p.type.isComplex() && !p.optional) {
r << QString(R"(
#[no_mangle]
pub unsafe extern "C" fn %2_get(
pub extern "C" fn %2_get(
ptr: *const %1,
p: *mut c_void,
set: fn(*mut c_void, %4),
set: fn(*mut c_void, *const c_char, c_int),
) {
let data = (&*ptr).%3();
set(p, %5data.into());
let o = unsafe { &*ptr };
let v = o.%3();
let s: *const c_char = v.as_ptr() as (*const c_char);
set(p, s, v.len() as c_int);
}
)").arg(o.name, base, snakeCase(p.name), p.type.name,
p.rustByValue ?"&" :"");
)").arg(o.name, base, snakeCase(p.name), p.type.name, p.rustByValue ?"&" :"");
if (p.write) {
const QString type = p.type.name == "QString" ? "QStringIn" : p.type.name;
const QString type = p.type.name == "QString" ? "*const c_ushort, len: c_int" : p.type.name;
r << QString(R"(
#[no_mangle]
pub unsafe extern "C" fn %2_set(ptr: *mut %1, v: %4) {
(&mut *ptr).set_%3(v.convert());
pub extern "C" fn %2_set(ptr: *mut %1, v: %4) {
let o = unsafe { &mut *ptr };
let mut s = String::new();
set_string_from_utf16(&mut s, v, len);
o.set_%3(s);
}
)").arg(o.name, base, snakeCase(p.name), type);
}
@ -700,42 +704,17 @@ where
if (hasString) {
r << R"(
#[repr(C)]
pub struct QString {
data: *const uint8_t,
len: c_int,
pub enum QString {}
fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) {
let utf16 = unsafe { slice::from_raw_parts(str, len as usize) };
let characters = decode_utf16(utf16.iter().cloned())
.into_iter()
.map(|r| r.unwrap());
s.clear();
s.extend(characters);
}
#[repr(C)]
pub struct QStringIn {
data: *const uint16_t,
len: c_int,
}
impl QStringIn {
fn convert(&self) -> String {
let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) };
String::from_utf16_lossy(data)
}
}
impl<'a> From<&'a str> for QString {
fn from(string: &'a str) -> QString {
QString {
len: string.len() as c_int,
data: string.as_ptr(),
}
}
}
impl<'a> From<&'a String> for QString {
fn from(string: &'a String) -> QString {
QString {
len: string.len() as c_int,
data: string.as_ptr(),
}
}
}
)";
}
if (hasByteArray) {
@ -788,8 +767,9 @@ void writeRustInterface(const Configuration& conf) {
r << QString(R"(/* generated by rust_qt_binding_generator */
#![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_int, c_void, uint8_t, uint16_t};
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t};
use std::slice;
use std::char::decode_utf16;
use std::sync::{Arc, Mutex};
use std::ptr::null;

View File

@ -1,8 +1,9 @@
/* generated by rust_qt_binding_generator */
#![allow(unknown_lints)]
#![allow(mutex_atomic, needless_pass_by_value)]
use libc::{c_int, c_void, uint8_t, uint16_t};
use libc::{c_char, c_ushort, c_int, c_void, uint8_t, uint16_t};
use std::slice;
use std::char::decode_utf16;
use std::sync::{Arc, Mutex};
use std::ptr::null;
@ -10,42 +11,17 @@ use std::ptr::null;
use implementation::*;
#[repr(C)]
pub struct QString {
data: *const uint8_t,
len: c_int,
pub enum QString {}
fn set_string_from_utf16(s: &mut String, str: *const c_ushort, len: c_int) {
let utf16 = unsafe { slice::from_raw_parts(str, len as usize) };
let characters = decode_utf16(utf16.iter().cloned())
.into_iter()
.map(|r| r.unwrap());
s.clear();
s.extend(characters);
}
#[repr(C)]
pub struct QStringIn {
data: *const uint16_t,
len: c_int,
}
impl QStringIn {
fn convert(&self) -> String {
let data = unsafe { slice::from_raw_parts(self.data, self.len as usize) };
String::from_utf16_lossy(data)
}
}
impl<'a> From<&'a str> for QString {
fn from(string: &'a str) -> QString {
QString {
len: string.len() as c_int,
data: string.as_ptr(),
}
}
}
impl<'a> From<&'a String> for QString {
fn from(string: &'a String) -> QString {
QString {
len: string.len() as c_int,
data: string.as_ptr(),
}
}
}
pub struct PersonQObject {}
@ -95,16 +71,21 @@ pub unsafe extern "C" fn person_free(ptr: *mut Person) {
}
#[no_mangle]
pub unsafe extern "C" fn person_user_name_get(
pub extern "C" fn person_user_name_get(
ptr: *const Person,
p: *mut c_void,
set: fn(*mut c_void, QString),
set: fn(*mut c_void, *const c_char, c_int),
) {
let data = (&*ptr).user_name();
set(p, data.into());
let o = unsafe { &*ptr };
let v = o.user_name();
let s: *const c_char = v.as_ptr() as (*const c_char);
set(p, s, v.len() as c_int);
}
#[no_mangle]
pub unsafe extern "C" fn person_user_name_set(ptr: *mut Person, v: QStringIn) {
(&mut *ptr).set_user_name(v.convert());
pub extern "C" fn person_user_name_set(ptr: *mut Person, v: *const c_ushort, len: c_int) {
let o = unsafe { &mut *ptr };
let mut s = String::new();
set_string_from_utf16(&mut s, v, len);
o.set_user_name(s);
}

View File

@ -3,22 +3,9 @@
namespace {
struct qstring_t {
private:
const void* data;
int len;
public:
qstring_t(const QString& v):
data(static_cast<const void*>(v.utf16())),
len(v.size()) {
}
operator QString() const {
return QString::fromUtf8(static_cast<const char*>(data), len);
}
};
typedef void (*qstring_set)(QString*, qstring_t*);
void set_qstring(QString* v, qstring_t* val) {
*v = *val;
typedef void (*qstring_set)(QString* val, const char* utf8, int nbytes);
void set_qstring(QString* val, const char* utf8, int nbytes) {
*val = QString::fromUtf8(utf8, nbytes);
}
inline void personUserNameChanged(Person* o)
{
@ -29,7 +16,7 @@ extern "C" {
Person::Private* person_new(Person*, void (*)(Person*));
void person_free(Person::Private*);
void person_user_name_get(const Person::Private*, QString*, qstring_set);
void person_user_name_set(Person::Private*, qstring_t);
void person_user_name_set(Person::Private*, const ushort *str, int len);
};
Person::Person(bool /*owned*/, QObject *parent):
@ -59,5 +46,5 @@ QString Person::userName() const
return v;
}
void Person::setUserName(const QString& v) {
person_user_name_set(m_d, v);
person_user_name_set(m_d, reinterpret_cast<const ushort*>(v.data()), v.size());
}