1- use crate :: { Message , RefEncode } ;
1+ use core:: mem:: ManuallyDrop ;
2+
3+ use crate :: runtime:: { Class , Sel } ;
4+ use crate :: { Message , MessageArguments , MessageError , MessageReceiver , RefEncode } ;
5+
6+ use super :: { Id , Ownership } ;
27
38/// TODO
49#[ repr( transparent) ]
@@ -11,3 +16,96 @@ unsafe impl<T: ?Sized + RefEncode> RefEncode for Allocated<T> {
1116}
1217
1318unsafe impl < T : ?Sized + Message > Message for Allocated < T > { }
19+
20+ // #[doc(hidden)]
21+ // pub trait __MsgSendId<const IS_INIT: bool, T, U> {
22+ // fn __prepare(t: T) -> U;
23+ // }
24+
25+ // impl<T: ?Sized, O: Ownership>
26+ // __MsgSendId<true, Id<Allocated<T>, O>, ManuallyDrop<Id<Allocated<T>, O>>> for ()
27+ // {
28+ // fn __prepare(t: Id<Allocated<T>, O>) -> ManuallyDrop<Id<Allocated<T>, O>> {
29+ // ManuallyDrop::new(t)
30+ // }
31+ // }
32+
33+ // impl<T> __MsgSendId<false, T, T> for () {
34+ // fn __prepare(t: T) -> T {
35+ // t
36+ // }
37+ // }
38+
39+ #[ doc( hidden) ]
40+ pub struct __Assert < const ALLOC : bool , const INIT : bool , const RETAINED : bool > { }
41+
42+ #[ doc( hidden) ]
43+ pub trait __MsgSendId < T , U > {
44+ unsafe fn __send_message < A : MessageArguments > (
45+ obj : T ,
46+ sel : Sel ,
47+ args : A ,
48+ ) -> Result < U , MessageError > ;
49+ }
50+
51+ impl < T : ?Sized + Message , O : Ownership > __MsgSendId < & ' _ Class , Id < Allocated < T > , O > >
52+ for __Assert < true , false , true >
53+ {
54+ unsafe fn __send_message < A : MessageArguments > (
55+ cls : & Class ,
56+ sel : Sel ,
57+ args : A ,
58+ ) -> Result < Id < Allocated < T > , O > , MessageError > {
59+ unsafe {
60+ MessageReceiver :: send_message ( & cls, sel, args)
61+ . map ( |r| Id :: new ( r) . expect ( "Failed allocating" ) )
62+ }
63+ }
64+ }
65+
66+ impl < T : ?Sized + Message , O : Ownership > __MsgSendId < Id < Allocated < T > , O > , Option < Id < T , O > > >
67+ for __Assert < false , true , true >
68+ {
69+ unsafe fn __send_message < A : MessageArguments > (
70+ obj : Id < Allocated < T > , O > ,
71+ sel : Sel ,
72+ args : A ,
73+ ) -> Result < Option < Id < T , O > > , MessageError > {
74+ let obj = ManuallyDrop :: new ( obj) ;
75+ unsafe { MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: new ( r) ) }
76+ }
77+ }
78+
79+ impl < T : MessageReceiver , U : ?Sized + Message , O : Ownership > __MsgSendId < T , Option < Id < U , O > > >
80+ for __Assert < false , false , true >
81+ {
82+ unsafe fn __send_message < A : MessageArguments > (
83+ obj : T ,
84+ sel : Sel ,
85+ args : A ,
86+ ) -> Result < Option < Id < U , O > > , MessageError > {
87+ unsafe { MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: new ( r) ) }
88+ }
89+ }
90+
91+ impl < T : MessageReceiver , U : Message , O : Ownership > __MsgSendId < T , Option < Id < U , O > > >
92+ for __Assert < false , false , false >
93+ {
94+ unsafe fn __send_message < A : MessageArguments > (
95+ obj : T ,
96+ sel : Sel ,
97+ args : A ,
98+ ) -> Result < Option < Id < U , O > > , MessageError > {
99+ // All code between the message send and the `retain_autoreleased`
100+ // must be able to be optimized away for this to work.
101+ unsafe {
102+ MessageReceiver :: send_message ( & obj, sel, args) . map ( |r| Id :: retain_autoreleased ( r) )
103+ }
104+ }
105+ }
106+
107+ // impl<T> __MsgSendId<T, T> for __Assert<false> {
108+ // fn __prepare(t: T) -> T {
109+ // t
110+ // }
111+ // }
0 commit comments