Skip to content

Commit 61ea381

Browse files
jnboothLeonMatthesKDAB
authored andcommitted
implement Deref and DerefMut for QStringList to QList<QString>
1 parent f5afefe commit 61ea381

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

crates/cxx-qt-lib/include/core/qstringlist.h

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ struct IsRelocatable<QStringList> : ::std::true_type
2525
namespace rust {
2626
namespace cxxqtlib1 {
2727

28+
const QList<QString>&
29+
qstringlistAsQListQStringRef(const QStringList& list);
30+
QList<QString>&
31+
qstringlistAsQListQStringRef(QStringList& list);
2832
QStringList
2933
qstringlistFromQListQString(const QList<QString>& list);
3034
QList<QString>

crates/cxx-qt-lib/src/core/qstringlist.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ static_assert(QTypeInfo<QStringList>::isRelocatable);
3636
namespace rust {
3737
namespace cxxqtlib1 {
3838

39+
const QList<QString>&
40+
qstringlistAsQListQStringRef(const QStringList& list)
41+
{
42+
return static_cast<const QList<QString>&>(list);
43+
}
44+
45+
QList<QString>&
46+
qstringlistAsQListQStringRef(QStringList& list)
47+
{
48+
return static_cast<QList<QString>&>(list);
49+
}
50+
3951
QStringList
4052
qstringlistFromQListQString(const QList<QString>& list)
4153
{

crates/cxx-qt-lib/src/core/qstringlist.rs

+35
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use crate::{QList, QString};
66
use core::mem::MaybeUninit;
77
use cxx::{type_id, ExternType};
8+
use std::ops::{Deref, DerefMut};
89

910
#[cxx::bridge]
1011
mod ffi {
@@ -79,6 +80,11 @@ mod ffi {
7980

8081
#[namespace = "rust::cxxqtlib1"]
8182
unsafe extern "C++" {
83+
#[doc(hidden)]
84+
#[rust_name = "qstringlist_as_qlist_qstring_ref"]
85+
fn qstringlistAsQListQStringRef(list: &QStringList) -> &QList_QString;
86+
#[rust_name = "qstringlist_as_qlist_qstring_ref_mut"]
87+
fn qstringlistAsQListQStringRef(list: &mut QStringList) -> &mut QList_QString;
8288
#[doc(hidden)]
8389
#[rust_name = "qstringlist_from_qlist_qstring"]
8490
fn qstringlistFromQListQString(list: &QList_QString) -> QStringList;
@@ -174,10 +180,39 @@ impl From<&QStringList> for QList<QString> {
174180
}
175181
}
176182

183+
impl Deref for QStringList {
184+
type Target = QList<QString>;
185+
186+
fn deref(&self) -> &Self::Target {
187+
ffi::qstringlist_as_qlist_qstring_ref(self)
188+
}
189+
}
190+
191+
impl DerefMut for QStringList {
192+
fn deref_mut(&mut self) -> &mut Self::Target {
193+
ffi::qstringlist_as_qlist_qstring_ref_mut(self)
194+
}
195+
}
196+
177197
// Safety:
178198
//
179199
// Static checks on the C++ side to ensure the size is the same.
180200
unsafe impl ExternType for QStringList {
181201
type Id = type_id!("QStringList");
182202
type Kind = cxx::kind::Trivial;
183203
}
204+
205+
#[cfg(test)]
206+
mod test {
207+
use super::*;
208+
209+
#[test]
210+
fn deref() {
211+
let mut list = QStringList::default();
212+
list.append(QString::from("element"));
213+
assert_eq!(
214+
list.get(0).map(|s| s.to_string()),
215+
Some("element".to_owned())
216+
);
217+
}
218+
}

0 commit comments

Comments
 (0)