1
+ //! Utilities for the `NSArray` and `NSMutableArray` classes.
1
2
#![ cfg( feature = "Foundation_NSArray" ) ]
2
3
use alloc:: vec:: Vec ;
3
4
use core:: fmt;
4
5
use core:: mem;
5
6
use core:: ops:: { Index , IndexMut , Range } ;
6
7
use core:: panic:: { RefUnwindSafe , UnwindSafe } ;
7
8
8
- use objc2:: msg_send;
9
9
use objc2:: mutability:: { IsMutable , IsRetainable } ;
10
+ use objc2:: rc:: IdFromIterator ;
10
11
12
+ use super :: iter;
11
13
use super :: util;
12
14
use crate :: common:: * ;
13
15
#[ cfg( feature = "Foundation_NSMutableArray" ) ]
@@ -220,15 +222,6 @@ extern_methods!(
220
222
) ;
221
223
222
224
impl < T : Message > NSArray < T > {
223
- #[ doc( alias = "objectEnumerator" ) ]
224
- #[ cfg( feature = "Foundation_NSEnumerator" ) ]
225
- pub fn iter ( & self ) -> Foundation :: NSEnumerator2 < ' _ , T > {
226
- unsafe {
227
- let result: * mut Object = msg_send ! [ self , objectEnumerator] ;
228
- Foundation :: NSEnumerator2 :: from_ptr ( result)
229
- }
230
- }
231
-
232
225
unsafe fn objects_in_range_unchecked ( & self , range : Range < usize > ) -> Vec < & T > {
233
226
let range = Foundation :: NSRange :: from ( range) ;
234
227
let mut vec: Vec < NonNull < T > > = Vec :: with_capacity ( range. length ) ;
@@ -340,33 +333,109 @@ impl<T: Message> NSMutableArray<T> {
340
333
}
341
334
}
342
335
343
- unsafe impl < T : Message > Foundation :: NSFastEnumeration2 for NSArray < T > {
336
+ impl < T : Message > NSArray < T > {
337
+ #[ doc( alias = "objectEnumerator" ) ]
338
+ #[ inline]
339
+ pub fn iter ( & self ) -> Iter < ' _ , T > {
340
+ Iter ( super :: iter:: Iter :: new ( self ) )
341
+ }
342
+
343
+ #[ doc( alias = "objectEnumerator" ) ]
344
+ #[ inline]
345
+ pub fn iter_mut ( & mut self ) -> IterMut < ' _ , T >
346
+ where
347
+ T : IsMutable ,
348
+ {
349
+ IterMut ( super :: iter:: IterMut :: new ( self ) )
350
+ }
351
+
352
+ #[ doc( alias = "objectEnumerator" ) ]
353
+ #[ inline]
354
+ pub fn iter_retained ( & self ) -> IterRetained < ' _ , T >
355
+ where
356
+ T : IsIdCloneable ,
357
+ {
358
+ IterRetained ( super :: iter:: IterRetained :: new ( self ) )
359
+ }
360
+ }
361
+
362
+ unsafe impl < T : Message > iter:: FastEnumerationHelper for NSArray < T > {
344
363
type Item = T ;
364
+
365
+ #[ inline]
366
+ fn maybe_len ( & self ) -> Option < usize > {
367
+ Some ( self . len ( ) )
368
+ }
345
369
}
346
370
347
371
#[ cfg( feature = "Foundation_NSMutableArray" ) ]
348
- unsafe impl < T : Message > Foundation :: NSFastEnumeration2 for NSMutableArray < T > {
372
+ unsafe impl < T : Message > iter :: FastEnumerationHelper for NSMutableArray < T > {
349
373
type Item = T ;
374
+
375
+ #[ inline]
376
+ fn maybe_len ( & self ) -> Option < usize > {
377
+ Some ( self . len ( ) )
378
+ }
350
379
}
351
380
352
- impl < ' a , T : Message > IntoIterator for & ' a NSArray < T > {
353
- type Item = & ' a T ;
354
- type IntoIter = Foundation :: NSFastEnumerator2 < ' a , NSArray < T > > ;
381
+ /// An iterator over the items of a ` NSArray`.
382
+ # [ derive ( Debug ) ]
383
+ pub struct Iter < ' a , T : Message > ( iter :: Iter < ' a , NSArray < T > > ) ;
355
384
356
- fn into_iter ( self ) -> Self :: IntoIter {
357
- use Foundation :: NSFastEnumeration2 ;
358
- self . iter_fast ( )
359
- }
385
+ __impl_iter ! {
386
+ impl <' a, T : Message > Iterator <Item = & ' a T > for Iter <' a, T > { ... }
360
387
}
361
388
362
- #[ cfg( feature = "Foundation_NSMutableArray" ) ]
363
- impl < ' a , T : Message > IntoIterator for & ' a NSMutableArray < T > {
364
- type Item = & ' a T ;
365
- type IntoIter = Foundation :: NSFastEnumerator2 < ' a , NSMutableArray < T > > ;
389
+ /// A mutable iterator over the items of a `NSArray`.
390
+ #[ derive( Debug ) ]
391
+ pub struct IterMut < ' a , T : Message > ( iter:: IterMut < ' a , NSArray < T > > ) ;
366
392
367
- fn into_iter ( self ) -> Self :: IntoIter {
368
- use Foundation :: NSFastEnumeration2 ;
369
- self . iter_fast ( )
393
+ __impl_iter ! {
394
+ impl <' a, T : IsMutable > Iterator <Item = & ' a mut T > for IterMut <' a, T > { ... }
395
+ }
396
+
397
+ /// An iterator that retains the items of a `NSArray`.
398
+ #[ derive( Debug ) ]
399
+ pub struct IterRetained < ' a , T : Message > ( iter:: IterRetained < ' a , NSArray < T > > ) ;
400
+
401
+ __impl_iter ! {
402
+ impl <' a, T : IsIdCloneable > Iterator <Item = Id <T >> for IterRetained <' a, T > { ... }
403
+ }
404
+
405
+ /// A consuming iterator over the items of a `NSArray`.
406
+ #[ derive( Debug ) ]
407
+ pub struct IntoIter < T : Message > ( iter:: IntoIter < NSArray < T > > ) ;
408
+
409
+ __impl_iter ! {
410
+ impl <' a, T : Message > Iterator <Item = Id <T >> for IntoIter <T > { ... }
411
+ }
412
+
413
+ __impl_into_iter ! {
414
+ impl <T : Message > IntoIterator for & NSArray <T > {
415
+ type IntoIter = Iter <' _, T >;
416
+ }
417
+
418
+ #[ cfg( feature = "Foundation_NSMutableArray" ) ]
419
+ impl <T : Message > IntoIterator for & NSMutableArray <T > {
420
+ type IntoIter = Iter <' _, T >;
421
+ }
422
+
423
+ impl <T : IsMutable > IntoIterator for & mut NSArray <T > {
424
+ type IntoIter = IterMut <' _, T >;
425
+ }
426
+
427
+ #[ cfg( feature = "Foundation_NSMutableArray" ) ]
428
+ impl <T : IsMutable > IntoIterator for & mut NSMutableArray <T > {
429
+ type IntoIter = IterMut <' _, T >;
430
+ }
431
+
432
+ impl <T : IsIdCloneable > IntoIterator for Id <NSArray <T >> {
433
+ type IntoIter = IntoIter <T >;
434
+ }
435
+
436
+ #[ cfg( feature = "Foundation_NSMutableArray" ) ]
437
+ impl <T : Message > IntoIterator for Id <NSMutableArray <T >> {
438
+ type IntoIter = IntoIter <T >;
370
439
}
371
440
}
372
441
@@ -403,8 +472,7 @@ impl<T: IsMutable> IndexMut<usize> for NSMutableArray<T> {
403
472
impl < T : fmt:: Debug + Message > fmt:: Debug for NSArray < T > {
404
473
#[ inline]
405
474
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
406
- use Foundation :: NSFastEnumeration2 ;
407
- f. debug_list ( ) . entries ( self . iter_fast ( ) ) . finish ( )
475
+ f. debug_list ( ) . entries ( self ) . finish ( )
408
476
}
409
477
}
410
478
@@ -424,3 +492,33 @@ impl<'a, T: IsRetainable> Extend<&'a T> for NSMutableArray<T> {
424
492
. for_each ( move |item| unsafe { self . addObject ( item) } )
425
493
}
426
494
}
495
+
496
+ impl < ' a , T : IsRetainable + ' a > IdFromIterator < & ' a T > for NSArray < T > {
497
+ fn id_from_iter < I : IntoIterator < Item = & ' a T > > ( iter : I ) -> Id < Self > {
498
+ let vec = Vec :: from_iter ( iter) ;
499
+ Self :: from_slice ( & vec)
500
+ }
501
+ }
502
+
503
+ impl < T : Message > IdFromIterator < Id < T > > for NSArray < T > {
504
+ fn id_from_iter < I : IntoIterator < Item = Id < T > > > ( iter : I ) -> Id < Self > {
505
+ let vec = Vec :: from_iter ( iter) ;
506
+ Self :: from_vec ( vec)
507
+ }
508
+ }
509
+
510
+ #[ cfg( feature = "Foundation_NSMutableArray" ) ]
511
+ impl < ' a , T : IsRetainable + ' a > IdFromIterator < & ' a T > for NSMutableArray < T > {
512
+ fn id_from_iter < I : IntoIterator < Item = & ' a T > > ( iter : I ) -> Id < Self > {
513
+ let vec = Vec :: from_iter ( iter) ;
514
+ Self :: from_slice ( & vec)
515
+ }
516
+ }
517
+
518
+ #[ cfg( feature = "Foundation_NSMutableArray" ) ]
519
+ impl < T : Message > IdFromIterator < Id < T > > for NSMutableArray < T > {
520
+ fn id_from_iter < I : IntoIterator < Item = Id < T > > > ( iter : I ) -> Id < Self > {
521
+ let vec = Vec :: from_iter ( iter) ;
522
+ Self :: from_vec ( vec)
523
+ }
524
+ }
0 commit comments