use alloc::vec::Vec;
#[cfg(feature = "NSEnumerator")]
use core::fmt;
use objc2::rc::{Retained, RetainedFromIterator};
use objc2::{msg_send, AllocAnyThread, Message};
#[cfg(feature = "NSEnumerator")]
use crate::iter;
use crate::{util, NSMutableSet, NSSet};
impl<ObjectType: Message> NSSet<ObjectType> {
pub fn from_retained_slice(slice: &[Retained<ObjectType>]) -> Retained<Self> {
let len = slice.len();
let ptr = util::retained_ptr_cast_const(slice.as_ptr());
unsafe { Self::initWithObjects_count(Self::alloc(), ptr, len) }
}
pub fn from_slice(slice: &[&ObjectType]) -> Retained<Self> {
let len = slice.len();
let ptr = util::ref_ptr_cast_const(slice.as_ptr());
unsafe { Self::initWithObjects_count(Self::alloc(), ptr, len) }
}
}
impl<ObjectType: Message> NSMutableSet<ObjectType> {
pub fn from_retained_slice(slice: &[Retained<ObjectType>]) -> Retained<Self> {
let len = slice.len();
let ptr = util::retained_ptr_cast_const(slice.as_ptr());
unsafe { Self::initWithObjects_count(Self::alloc(), ptr, len) }
}
pub fn from_slice(slice: &[&ObjectType]) -> Retained<Self> {
let len = slice.len();
let ptr = util::ref_ptr_cast_const(slice.as_ptr());
unsafe { Self::initWithObjects_count(Self::alloc(), ptr, len) }
}
}
impl<ObjectType: Message> NSSet<ObjectType> {
#[doc(alias = "anyObject")]
pub unsafe fn anyObject_unchecked(&self) -> Option<&ObjectType> {
unsafe { msg_send![self, anyObject] }
}
#[doc(alias = "member:")]
pub unsafe fn member_unchecked(&self, object: &ObjectType) -> Option<&ObjectType> {
unsafe { msg_send![self, member: object] }
}
#[cfg(feature = "NSEnumerator")]
#[doc(alias = "objectEnumerator")]
#[inline]
pub unsafe fn iter_unchecked(&self) -> IterUnchecked<'_, ObjectType> {
IterUnchecked(super::iter::IterUnchecked::new(self))
}
}
impl<ObjectType: Message> NSSet<ObjectType> {
#[doc(alias = "count")]
pub fn len(&self) -> usize {
self.count()
}
pub fn is_empty(&self) -> bool {
self.count() == 0
}
#[cfg(feature = "NSEnumerator")]
#[doc(alias = "objectEnumerator")]
#[inline]
pub fn iter(&self) -> Iter<'_, ObjectType> {
Iter(super::iter::Iter::new(self))
}
#[cfg(feature = "NSEnumerator")]
pub fn to_vec(&self) -> Vec<Retained<ObjectType>> {
self.iter().collect()
}
}
#[cfg(feature = "NSEnumerator")]
unsafe impl<ObjectType: Message> iter::FastEnumerationHelper for NSSet<ObjectType> {
type Item = ObjectType;
#[inline]
fn maybe_len(&self) -> Option<usize> {
Some(self.len())
}
}
#[cfg(feature = "NSEnumerator")]
unsafe impl<ObjectType: Message> iter::FastEnumerationHelper for NSMutableSet<ObjectType> {
type Item = ObjectType;
#[inline]
fn maybe_len(&self) -> Option<usize> {
Some(self.len())
}
}
#[derive(Debug)]
#[cfg(feature = "NSEnumerator")]
pub struct Iter<'a, ObjectType: Message>(iter::Iter<'a, NSSet<ObjectType>>);
#[cfg(feature = "NSEnumerator")]
__impl_iter! {
impl<'a, ObjectType: Message> Iterator<Item = Retained<ObjectType>> for Iter<'a, ObjectType> { ... }
}
#[derive(Debug)]
#[cfg(feature = "NSEnumerator")]
pub struct IterUnchecked<'a, ObjectType: Message>(iter::IterUnchecked<'a, NSSet<ObjectType>>);
#[cfg(feature = "NSEnumerator")]
__impl_iter! {
impl<'a, ObjectType: Message> Iterator<Item = &'a ObjectType> for IterUnchecked<'a, ObjectType> { ... }
}
#[derive(Debug)]
#[cfg(feature = "NSEnumerator")]
pub struct IntoIter<ObjectType: Message>(iter::IntoIter<NSSet<ObjectType>>);
#[cfg(feature = "NSEnumerator")]
__impl_iter! {
impl<'a, ObjectType: Message> Iterator<Item = Retained<ObjectType>> for IntoIter<ObjectType> { ... }
}
#[cfg(feature = "NSEnumerator")]
__impl_into_iter! {
impl<ObjectType: Message> IntoIterator for &NSSet<ObjectType> {
type IntoIter = Iter<'_, ObjectType>;
}
impl<ObjectType: Message> IntoIterator for &NSMutableSet<ObjectType> {
type IntoIter = Iter<'_, ObjectType>;
}
impl<ObjectType: Message> IntoIterator for Retained<NSSet<ObjectType>> {
#[uses(new)]
type IntoIter = IntoIter<ObjectType>;
}
impl<ObjectType: Message> IntoIterator for Retained<NSMutableSet<ObjectType>> {
#[uses(new_mutable)]
type IntoIter = IntoIter<ObjectType>;
}
}
#[cfg(feature = "NSEnumerator")]
impl<ObjectType: fmt::Debug + Message> fmt::Debug for NSSet<ObjectType> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_set().entries(self).finish()
}
}
#[cfg(feature = "NSEnumerator")]
impl<ObjectType: fmt::Debug + Message> fmt::Debug for NSMutableSet<ObjectType> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&**self, f)
}
}
#[cfg(feature = "NSEnumerator")]
impl<ObjectType: fmt::Debug + Message> fmt::Debug for crate::NSCountedSet<ObjectType> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&**self, f)
}
}
impl<ObjectType: Message> Extend<Retained<ObjectType>> for &NSMutableSet<ObjectType> {
fn extend<I: IntoIterator<Item = Retained<ObjectType>>>(&mut self, iter: I) {
iter.into_iter().for_each(move |item| {
self.addObject(&item);
});
}
}
impl<'a, ObjectType: Message> Extend<&'a ObjectType> for &NSMutableSet<ObjectType> {
fn extend<I: IntoIterator<Item = &'a ObjectType>>(&mut self, iter: I) {
iter.into_iter().for_each(move |item| {
self.addObject(item);
});
}
}
impl<'a, ObjectType: Message + 'a> RetainedFromIterator<&'a ObjectType> for NSSet<ObjectType> {
fn retained_from_iter<I: IntoIterator<Item = &'a ObjectType>>(iter: I) -> Retained<Self> {
let vec = Vec::from_iter(iter);
Self::from_slice(&vec)
}
}
impl<ObjectType: Message> RetainedFromIterator<Retained<ObjectType>> for NSSet<ObjectType> {
fn retained_from_iter<I: IntoIterator<Item = Retained<ObjectType>>>(iter: I) -> Retained<Self> {
let vec = Vec::from_iter(iter);
Self::from_retained_slice(&vec)
}
}
impl<'a, ObjectType: Message + 'a> RetainedFromIterator<&'a ObjectType>
for NSMutableSet<ObjectType>
{
fn retained_from_iter<I: IntoIterator<Item = &'a ObjectType>>(iter: I) -> Retained<Self> {
let vec = Vec::from_iter(iter);
Self::from_slice(&vec)
}
}
impl<ObjectType: Message> RetainedFromIterator<Retained<ObjectType>> for NSMutableSet<ObjectType> {
fn retained_from_iter<I: IntoIterator<Item = Retained<ObjectType>>>(iter: I) -> Retained<Self> {
let vec = Vec::from_iter(iter);
Self::from_retained_slice(&vec)
}
}