@@ -19,6 +19,17 @@ use crate::common::*;
19
19
use crate :: Foundation :: NSMutableDictionary ;
20
20
use crate :: Foundation :: { self , NSCopying , NSDictionary } ;
21
21
22
+ fn keys_to_ptr < Q > ( keys : & [ & Q ] ) -> * mut NonNull < ProtocolObject < dyn NSCopying > >
23
+ where
24
+ Q : Message + NSCopying ,
25
+ {
26
+ let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
27
+ // SAFETY: `Q` is `Message + NSCopying`, and is therefore safe to cast to
28
+ // `ProtocolObject<dyn NSCopying>`.
29
+ let keys: * mut NonNull < ProtocolObject < dyn NSCopying > > = keys. cast ( ) ;
30
+ keys
31
+ }
32
+
22
33
impl < K : Message + Eq + Hash + HasStableHash , V : Message > NSDictionary < K , V > {
23
34
pub fn from_vec < Q > ( keys : & [ & Q ] , mut objects : Vec < Id < V > > ) -> Id < Self >
24
35
where
@@ -31,8 +42,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSDictionary<K, V> {
31
42
// different lengths, either would be fine.
32
43
let count = min ( keys. len ( ) , objects. len ( ) ) ;
33
44
34
- let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
35
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
45
+ let keys = keys_to_ptr ( keys) ;
36
46
let objects = util:: id_ptr_cast ( objects. as_mut_ptr ( ) ) ;
37
47
38
48
// SAFETY:
@@ -62,8 +72,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSDictionary<K, V> {
62
72
{
63
73
let count = min ( keys. len ( ) , objects. len ( ) ) ;
64
74
65
- let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
66
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
75
+ let keys = keys_to_ptr ( keys) ;
67
76
let objects = util:: id_ptr_cast_const ( objects. as_ptr ( ) ) ;
68
77
69
78
// SAFETY: See `NSDictionary::from_vec` and `NSArray::from_id_slice`.
@@ -77,8 +86,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSDictionary<K, V> {
77
86
{
78
87
let count = min ( keys. len ( ) , objects. len ( ) ) ;
79
88
80
- let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
81
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
89
+ let keys = keys_to_ptr ( keys) ;
82
90
let objects = util:: ref_ptr_cast_const ( objects. as_ptr ( ) ) ;
83
91
84
92
// SAFETY: See `NSDictionary::from_vec` and `NSArray::from_slice`.
@@ -95,7 +103,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSMutableDictionary<K,
95
103
let count = min ( keys. len ( ) , objects. len ( ) ) ;
96
104
97
105
let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
98
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
106
+ let keys: * mut NonNull < ProtocolObject < dyn NSCopying > > = keys. cast ( ) ;
99
107
let objects = util:: id_ptr_cast ( objects. as_mut_ptr ( ) ) ;
100
108
101
109
// SAFETY: See `NSDictionary::from_vec`
@@ -109,8 +117,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSMutableDictionary<K,
109
117
{
110
118
let count = min ( keys. len ( ) , objects. len ( ) ) ;
111
119
112
- let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
113
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
120
+ let keys = keys_to_ptr ( keys) ;
114
121
let objects = util:: id_ptr_cast_const ( objects. as_ptr ( ) ) ;
115
122
116
123
// SAFETY: See `NSDictionary::from_vec` and `NSArray::from_id_slice`.
@@ -124,8 +131,7 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSMutableDictionary<K,
124
131
{
125
132
let count = min ( keys. len ( ) , objects. len ( ) ) ;
126
133
127
- let keys: * mut NonNull < Q > = util:: ref_ptr_cast_const ( keys. as_ptr ( ) ) ;
128
- let keys: * mut NonNull < AnyObject > = keys. cast ( ) ;
134
+ let keys = keys_to_ptr ( keys) ;
129
135
let objects = util:: ref_ptr_cast_const ( objects. as_ptr ( ) ) ;
130
136
131
137
// SAFETY: See `NSDictionary::from_vec` and `NSArray::from_slice`.
@@ -335,13 +341,8 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSMutableDictionary<K,
335
341
. get ( key)
336
342
. map ( |old_obj| unsafe { util:: mutable_collection_retain_removed_id ( old_obj) } ) ;
337
343
338
- // SAFETY: It is always safe to transmute an `&T` where `T: Message`
339
- // to `&AnyObject`.
340
- let key: NonNull < K > = NonNull :: from ( key) ;
341
- let key: NonNull < AnyObject > = key. cast ( ) ;
342
- let key: & AnyObject = unsafe { key. as_ref ( ) } ;
343
- // SAFETY: The key is NSCopying (see `NSDictionary::from_vec`), and we
344
- // have ownership over the value.
344
+ let key = ProtocolObject :: from_ref ( key) ;
345
+ // SAFETY: We have ownership over the value.
345
346
unsafe { self . setObject_forKey ( & value, key) } ;
346
347
old_obj
347
348
}
@@ -371,14 +372,9 @@ impl<K: Message + Eq + Hash + HasStableHash, V: Message> NSMutableDictionary<K,
371
372
. get ( key)
372
373
. map ( |old_obj| unsafe { util:: mutable_collection_retain_removed_id ( old_obj) } ) ;
373
374
374
- // SAFETY: It is always safe to transmute an `&T` where `T: Message`
375
- // to `&AnyObject`.
376
- let key: NonNull < K > = NonNull :: from ( key) ;
377
- let key: NonNull < AnyObject > = key. cast ( ) ;
378
- let key: & AnyObject = unsafe { key. as_ref ( ) } ;
379
- // SAFETY: The key is NSCopying (see `NSDictionary::from_vec`), and
380
- // the value is `IsRetainable` (and hence safe for the collection to
381
- // retain).
375
+ let key = ProtocolObject :: from_ref ( key) ;
376
+ // SAFETY: The value is `IsRetainable`, and hence safe for the
377
+ // collection to retain.
382
378
unsafe { self . setObject_forKey ( value, key) } ;
383
379
old_obj
384
380
}
0 commit comments