Skip to content

Commit c68925d

Browse files
committed
Add IdFromIterator impls for collection types
1 parent 53de63e commit c68925d

File tree

5 files changed

+90
-12
lines changed

5 files changed

+90
-12
lines changed

crates/icrate/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
3131
* Added `MainThreadMarker::alloc` for allocating objects that need to be so on
3232
the main thread.
3333
* Added automatically generated `new`/`init` methods for all types.
34+
* Added `FromIterator` impls for various collection types.
3435

3536
### Changed
3637
* **BREAKING**: Renamed the `from_slice` method on `NSArray`, `NSSet`,

crates/icrate/src/Foundation/additions/array.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use core::ops::{Index, IndexMut, Range};
77
use core::panic::{RefUnwindSafe, UnwindSafe};
88

99
use objc2::mutability::{IsMutable, IsRetainable};
10+
use objc2::rc::IdFromIterator;
1011

1112
use super::iter;
1213
use super::util;
@@ -491,3 +492,33 @@ impl<'a, T: IsRetainable> Extend<&'a T> for NSMutableArray<T> {
491492
.for_each(move |item| unsafe { self.addObject(item) })
492493
}
493494
}
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+
}

crates/icrate/src/Foundation/additions/data.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ use core::ops::{IndexMut, Range};
88
use core::panic::{RefUnwindSafe, UnwindSafe};
99
use core::slice::{self, SliceIndex};
1010

11+
#[cfg(feature = "block")]
12+
use objc2::rc::IdFromIterator;
13+
1114
use crate::common::*;
1215
#[cfg(feature = "Foundation_NSMutableData")]
1316
use crate::Foundation::NSMutableData;
@@ -246,18 +249,22 @@ impl std::io::Write for NSMutableData {
246249
}
247250
}
248251

249-
// #[cfg(feature = "Foundation_NSMutableData")]
250-
// impl FromIterator<u8> for Id<NSMutableData> {
251-
// fn from_iter<T: IntoIterator<Item = u8>>(iter: T) -> Self {
252-
// let iter = iter.into_iter();
253-
// let (lower, _) = iter.size_hint();
254-
// let data = Self::with_capacity(lower);
255-
// for item in iter {
256-
// data.push(item);
257-
// }
258-
// data
259-
// }
260-
// }
252+
#[cfg(feature = "block")]
253+
impl IdFromIterator<u8> for NSData {
254+
fn id_from_iter<I: IntoIterator<Item = u8>>(iter: I) -> Id<Self> {
255+
let vec = Vec::from_iter(iter);
256+
Self::from_vec(vec)
257+
}
258+
}
259+
260+
#[cfg(feature = "Foundation_NSMutableData")]
261+
#[cfg(feature = "block")]
262+
impl IdFromIterator<u8> for NSMutableData {
263+
fn id_from_iter<I: IntoIterator<Item = u8>>(iter: I) -> Id<Self> {
264+
let vec = Vec::from_iter(iter);
265+
Self::from_vec(vec)
266+
}
267+
}
261268

262269
#[cfg(feature = "block")]
263270
unsafe fn with_vec<T: Message>(obj: Option<Allocated<T>>, bytes: Vec<u8>) -> Id<T> {

crates/icrate/src/Foundation/additions/set.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use core::fmt;
55
use core::panic::{RefUnwindSafe, UnwindSafe};
66

77
use objc2::mutability::IsRetainable;
8+
use objc2::rc::IdFromIterator;
89

910
use super::iter;
1011
use super::util;
@@ -517,3 +518,33 @@ impl<'a, T: IsRetainable + PartialEq> Extend<&'a T> for NSMutableSet<T> {
517518
.for_each(move |item| unsafe { self.addObject(item) })
518519
}
519520
}
521+
522+
impl<'a, T: IsRetainable + 'a> IdFromIterator<&'a T> for NSSet<T> {
523+
fn id_from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Id<Self> {
524+
let vec = Vec::from_iter(iter);
525+
Self::from_slice(&vec)
526+
}
527+
}
528+
529+
impl<T: Message> IdFromIterator<Id<T>> for NSSet<T> {
530+
fn id_from_iter<I: IntoIterator<Item = Id<T>>>(iter: I) -> Id<Self> {
531+
let vec = Vec::from_iter(iter);
532+
Self::from_vec(vec)
533+
}
534+
}
535+
536+
#[cfg(feature = "Foundation_NSMutableSet")]
537+
impl<'a, T: IsRetainable + 'a> IdFromIterator<&'a T> for NSMutableSet<T> {
538+
fn id_from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Id<Self> {
539+
let vec = Vec::from_iter(iter);
540+
Self::from_slice(&vec)
541+
}
542+
}
543+
544+
#[cfg(feature = "Foundation_NSMutableSet")]
545+
impl<T: Message> IdFromIterator<Id<T>> for NSMutableSet<T> {
546+
fn id_from_iter<I: IntoIterator<Item = Id<T>>>(iter: I) -> Id<Self> {
547+
let vec = Vec::from_iter(iter);
548+
Self::from_vec(vec)
549+
}
550+
}

crates/icrate/tests/data.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,11 @@ fn test_debug() {
3131
let data = NSData::with_bytes(&bytes);
3232
assert_eq!(format!("{data:?}"), "[3, 7, 16, 52, 112, 19]");
3333
}
34+
35+
#[cfg(feature = "block")]
36+
#[test]
37+
fn test_collect() {
38+
let bytes = [3, 7, 16, 52, 112, 19];
39+
let data: objc2::rc::Id<NSData> = bytes.into_iter().collect();
40+
assert_eq!(format!("{data:?}"), "[3, 7, 16, 52, 112, 19]");
41+
}

0 commit comments

Comments
 (0)