Skip to content

Commit ace0604

Browse files
committed
Add ClassType::as_super and ClassType::as_super_mut
1 parent d5634ab commit ace0604

File tree

6 files changed

+54
-1
lines changed

6 files changed

+54
-1
lines changed

objc2/examples/class_with_lifetime.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ unsafe impl<'a> ClassType for MyObject<'a> {
117117

118118
Class::get("MyObject").unwrap()
119119
}
120+
121+
fn as_super(&self) -> &Self::Super {
122+
&self.superclass
123+
}
124+
125+
fn as_super_mut(&mut self) -> &mut Self::Super {
126+
&mut self.superclass
127+
}
120128
}
121129

122130
fn main() {

objc2/src/class_type.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ use crate::Message;
1717
/// # Safety
1818
///
1919
/// The class returned by [`Self::class`] must be a subclass of the class that
20-
/// [`Self::Super`] represents.
20+
/// [`Self::Super`] represents, and `as_super`/`as_super_mut` must be
21+
/// implemented correctly.
2122
///
2223
/// In pseudocode:
2324
/// ```ignore
@@ -78,4 +79,12 @@ pub unsafe trait ClassType: Message {
7879
/// class, e.g. if the program is not properly linked to the framework
7980
/// that defines the class.
8081
fn class() -> &'static Class;
82+
83+
/// Get an immutable reference to the superclass.
84+
// Note: It'd be safe to provide a default impl using transmute here if
85+
// we wanted to!
86+
fn as_super(&self) -> &Self::Super;
87+
88+
/// Get a mutable reference to the superclass.
89+
fn as_super_mut(&mut self) -> &mut Self::Super;
8190
}

objc2/src/foundation/object.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ unsafe impl ClassType for NSObject {
2222
fn class() -> &'static Class {
2323
class!(NSObject)
2424
}
25+
26+
fn as_super(&self) -> &Self::Super {
27+
&self.__inner
28+
}
29+
30+
fn as_super_mut(&mut self) -> &mut Self::Super {
31+
&mut self.__inner
32+
}
2533
}
2634

2735
extern_methods!(

objc2/src/macros/declare_class.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,16 @@ macro_rules! declare_class {
454454
// We just registered the class, so it should be available
455455
$crate::runtime::Class::get(stringify!($name)).unwrap()
456456
}
457+
458+
#[inline]
459+
fn as_super(&self) -> &Self::Super {
460+
&self.__inner
461+
}
462+
463+
#[inline]
464+
fn as_super_mut(&mut self) -> &mut Self::Super {
465+
&mut self.__inner
466+
}
457467
}
458468

459469
// Methods

objc2/src/macros/extern_class.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ macro_rules! __inner_extern_class {
259259
fn class() -> &'static $crate::runtime::Class {
260260
$crate::class!($name)
261261
}
262+
263+
#[inline]
264+
fn as_super(&self) -> &Self::Super {
265+
&self.__inner
266+
}
267+
268+
#[inline]
269+
fn as_super_mut(&mut self) -> &mut Self::Super {
270+
&mut self.__inner
271+
}
262272
}
263273
};
264274
(

tests/src/test_object.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ unsafe impl ClassType for MyTestObject {
2626
fn class() -> &'static Class {
2727
class!(MyTestObject)
2828
}
29+
30+
fn as_super(&self) -> &Self::Super {
31+
&self.inner
32+
}
33+
34+
fn as_super_mut(&mut self) -> &mut Self::Super {
35+
&mut self.inner
36+
}
2937
}
3038

3139
impl MyTestObject {

0 commit comments

Comments
 (0)