//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;

use crate::*;

extern_class!(
    /// **************       Immutable Ordered Set   ***************
    ///
    /// See also [Apple's documentation](https://developer.apple.com/documentation/foundation/nsorderedset?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSOrderedSet<ObjectType: ?Sized = AnyObject>;
);

impl<ObjectType: ?Sized + Message> NSOrderedSet<ObjectType> {
    /// Unchecked conversion of the generic parameter.
    ///
    /// # Safety
    ///
    /// The generic must be valid to reinterpret as the given type.
    #[inline]
    pub unsafe fn cast_unchecked<NewObjectType: ?Sized + Message>(
        &self,
    ) -> &NSOrderedSet<NewObjectType> {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized + NSCoding> NSCoding for NSOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSCopying for NSOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
unsafe impl<ObjectType: ?Sized + Message> CopyingHelper for NSOrderedSet<ObjectType> {
    type Result = Self;
}

#[cfg(feature = "NSEnumerator")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSFastEnumeration for NSOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSMutableCopying for NSOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
unsafe impl<ObjectType: ?Sized + Message> MutableCopyingHelper for NSOrderedSet<ObjectType> {
    type Result = NSMutableOrderedSet<ObjectType>;
}

extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSObjectProtocol for NSOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized + NSSecureCoding> NSSecureCoding for NSOrderedSet<ObjectType> {}
);

impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(count))]
        #[unsafe(method_family = none)]
        pub fn count(&self) -> NSUInteger;

        #[unsafe(method(objectAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn objectAtIndex(&self, idx: NSUInteger) -> Retained<ObjectType>;

        #[unsafe(method(indexOfObject:))]
        #[unsafe(method_family = none)]
        pub fn indexOfObject(&self, object: &ObjectType) -> NSUInteger;

        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        /// # Safety
        ///
        /// `objects` must be a valid pointer or null.
        #[unsafe(method(initWithObjects:count:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithObjects_count(
            this: Allocated<Self>,
            objects: *mut NonNull<ObjectType>,
            cnt: NSUInteger,
        ) -> Retained<Self>;

        #[cfg(feature = "NSCoder")]
        /// # Safety
        ///
        /// `coder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;
    );
}

/// Methods declared on superclass `NSObject`.
impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl<ObjectType: Message> DefaultRetained for NSOrderedSet<ObjectType> {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

/// NSExtendedOrderedSet.
impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[cfg(feature = "NSRange")]
        /// # Safety
        ///
        /// `objects` must be a valid pointer or null.
        #[unsafe(method(getObjects:range:))]
        #[unsafe(method_family = none)]
        pub unsafe fn getObjects_range(&self, objects: *mut NonNull<ObjectType>, range: NSRange);

        #[cfg(all(feature = "NSArray", feature = "NSIndexSet"))]
        #[unsafe(method(objectsAtIndexes:))]
        #[unsafe(method_family = none)]
        pub fn objectsAtIndexes(&self, indexes: &NSIndexSet) -> Retained<NSArray<ObjectType>>;

        #[unsafe(method(firstObject))]
        #[unsafe(method_family = none)]
        pub fn firstObject(&self) -> Option<Retained<ObjectType>>;

        #[unsafe(method(lastObject))]
        #[unsafe(method_family = none)]
        pub fn lastObject(&self) -> Option<Retained<ObjectType>>;

        #[unsafe(method(isEqualToOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn isEqualToOrderedSet(&self, other: &NSOrderedSet<ObjectType>) -> bool;

        #[unsafe(method(containsObject:))]
        #[unsafe(method_family = none)]
        pub fn containsObject(&self, object: &ObjectType) -> bool;

        #[unsafe(method(intersectsOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn intersectsOrderedSet(&self, other: &NSOrderedSet<ObjectType>) -> bool;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(intersectsSet:))]
        #[unsafe(method_family = none)]
        pub fn intersectsSet(&self, set: &NSSet<ObjectType>) -> bool;

        #[unsafe(method(isSubsetOfOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn isSubsetOfOrderedSet(&self, other: &NSOrderedSet<ObjectType>) -> bool;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(isSubsetOfSet:))]
        #[unsafe(method_family = none)]
        pub fn isSubsetOfSet(&self, set: &NSSet<ObjectType>) -> bool;

        #[unsafe(method(objectAtIndexedSubscript:))]
        #[unsafe(method_family = none)]
        pub fn objectAtIndexedSubscript(&self, idx: NSUInteger) -> Retained<ObjectType>;

        #[cfg(feature = "NSEnumerator")]
        /// # Safety
        ///
        /// The returned enumerator's underlying collection should not be mutated while in use.
        #[unsafe(method(objectEnumerator))]
        #[unsafe(method_family = none)]
        pub unsafe fn objectEnumerator(&self) -> Retained<NSEnumerator<ObjectType>>;

        #[cfg(feature = "NSEnumerator")]
        /// # Safety
        ///
        /// The returned enumerator's underlying collection should not be mutated while in use.
        #[unsafe(method(reverseObjectEnumerator))]
        #[unsafe(method_family = none)]
        pub unsafe fn reverseObjectEnumerator(&self) -> Retained<NSEnumerator<ObjectType>>;

        #[unsafe(method(reversedOrderedSet))]
        #[unsafe(method_family = none)]
        pub fn reversedOrderedSet(&self) -> Retained<NSOrderedSet<ObjectType>>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(array))]
        #[unsafe(method_family = none)]
        pub fn array(&self) -> Retained<NSArray<ObjectType>>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(set))]
        #[unsafe(method_family = none)]
        pub fn set(&self) -> Retained<NSSet<ObjectType>>;

        #[cfg(feature = "block2")]
        #[unsafe(method(enumerateObjectsUsingBlock:))]
        #[unsafe(method_family = none)]
        pub fn enumerateObjectsUsingBlock(
            &self,
            block: &block2::DynBlock<dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) + '_>,
        );

        #[cfg(all(feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(enumerateObjectsWithOptions:usingBlock:))]
        #[unsafe(method_family = none)]
        pub fn enumerateObjectsWithOptions_usingBlock(
            &self,
            opts: NSEnumerationOptions,
            block: &block2::DynBlock<dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) + '_>,
        );

        #[cfg(all(feature = "NSIndexSet", feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(enumerateObjectsAtIndexes:options:usingBlock:))]
        #[unsafe(method_family = none)]
        pub fn enumerateObjectsAtIndexes_options_usingBlock(
            &self,
            s: &NSIndexSet,
            opts: NSEnumerationOptions,
            block: &block2::DynBlock<dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) + '_>,
        );

        #[cfg(feature = "block2")]
        #[unsafe(method(indexOfObjectPassingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexOfObjectPassingTest(
            &self,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> NSUInteger;

        #[cfg(all(feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(indexOfObjectWithOptions:passingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexOfObjectWithOptions_passingTest(
            &self,
            opts: NSEnumerationOptions,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> NSUInteger;

        #[cfg(all(feature = "NSIndexSet", feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(indexOfObjectAtIndexes:options:passingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexOfObjectAtIndexes_options_passingTest(
            &self,
            s: &NSIndexSet,
            opts: NSEnumerationOptions,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> NSUInteger;

        #[cfg(all(feature = "NSIndexSet", feature = "block2"))]
        #[unsafe(method(indexesOfObjectsPassingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexesOfObjectsPassingTest(
            &self,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> Retained<NSIndexSet>;

        #[cfg(all(feature = "NSIndexSet", feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(indexesOfObjectsWithOptions:passingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexesOfObjectsWithOptions_passingTest(
            &self,
            opts: NSEnumerationOptions,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> Retained<NSIndexSet>;

        #[cfg(all(feature = "NSIndexSet", feature = "NSObjCRuntime", feature = "block2"))]
        #[unsafe(method(indexesOfObjectsAtIndexes:options:passingTest:))]
        #[unsafe(method_family = none)]
        pub fn indexesOfObjectsAtIndexes_options_passingTest(
            &self,
            s: &NSIndexSet,
            opts: NSEnumerationOptions,
            predicate: &block2::DynBlock<
                dyn Fn(NonNull<ObjectType>, NSUInteger, NonNull<Bool>) -> Bool + '_,
            >,
        ) -> Retained<NSIndexSet>;

        #[cfg(all(
            feature = "NSArray",
            feature = "NSObjCRuntime",
            feature = "NSRange",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `cmp` must be a valid pointer.
        #[unsafe(method(indexOfObject:inSortedRange:options:usingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn indexOfObject_inSortedRange_options_usingComparator(
            &self,
            object: &ObjectType,
            range: NSRange,
            opts: NSBinarySearchingOptions,
            cmp: NSComparator,
        ) -> NSUInteger;

        #[cfg(all(feature = "NSArray", feature = "NSObjCRuntime", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortedArrayUsingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortedArrayUsingComparator(
            &self,
            cmptr: NSComparator,
        ) -> Retained<NSArray<ObjectType>>;

        #[cfg(all(feature = "NSArray", feature = "NSObjCRuntime", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortedArrayWithOptions:usingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortedArrayWithOptions_usingComparator(
            &self,
            opts: NSSortOptions,
            cmptr: NSComparator,
        ) -> Retained<NSArray<ObjectType>>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(description))]
        #[unsafe(method_family = none)]
        pub fn description(&self) -> Retained<NSString>;

        #[cfg(feature = "NSString")]
        /// # Safety
        ///
        /// `locale` should be of the correct type.
        #[unsafe(method(descriptionWithLocale:))]
        #[unsafe(method_family = none)]
        pub unsafe fn descriptionWithLocale(
            &self,
            locale: Option<&AnyObject>,
        ) -> Retained<NSString>;

        #[cfg(feature = "NSString")]
        /// # Safety
        ///
        /// `locale` should be of the correct type.
        #[unsafe(method(descriptionWithLocale:indent:))]
        #[unsafe(method_family = none)]
        pub unsafe fn descriptionWithLocale_indent(
            &self,
            locale: Option<&AnyObject>,
            level: NSUInteger,
        ) -> Retained<NSString>;
    );
}

/// NSOrderedSetCreation.
impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(orderedSet))]
        #[unsafe(method_family = none)]
        pub fn orderedSet() -> Retained<Self>;

        #[unsafe(method(orderedSetWithObject:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithObject(object: &ObjectType) -> Retained<Self>;

        /// # Safety
        ///
        /// `objects` must be a valid pointer.
        #[unsafe(method(orderedSetWithObjects:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithObjects_count(
            objects: NonNull<NonNull<ObjectType>>,
            cnt: NSUInteger,
        ) -> Retained<Self>;

        #[unsafe(method(orderedSetWithOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithOrderedSet(set: &NSOrderedSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSRange")]
        #[unsafe(method(orderedSetWithOrderedSet:range:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithOrderedSet_range_copyItems(
            set: &NSOrderedSet<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(orderedSetWithArray:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithArray(array: &NSArray<ObjectType>) -> Retained<Self>;

        #[cfg(all(feature = "NSArray", feature = "NSRange"))]
        #[unsafe(method(orderedSetWithArray:range:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithArray_range_copyItems(
            array: &NSArray<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(orderedSetWithSet:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithSet(set: &NSSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(orderedSetWithSet:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithSet_copyItems(
            set: &NSSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[unsafe(method(initWithObject:))]
        #[unsafe(method_family = init)]
        pub fn initWithObject(this: Allocated<Self>, object: &ObjectType) -> Retained<Self>;

        #[unsafe(method(initWithOrderedSet:))]
        #[unsafe(method_family = init)]
        pub fn initWithOrderedSet(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
        ) -> Retained<Self>;

        #[unsafe(method(initWithOrderedSet:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithOrderedSet_copyItems(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSRange")]
        #[unsafe(method(initWithOrderedSet:range:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithOrderedSet_range_copyItems(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(initWithArray:))]
        #[unsafe(method_family = init)]
        pub fn initWithArray(this: Allocated<Self>, array: &NSArray<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(initWithArray:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithArray_copyItems(
            this: Allocated<Self>,
            set: &NSArray<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(all(feature = "NSArray", feature = "NSRange"))]
        #[unsafe(method(initWithArray:range:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithArray_range_copyItems(
            this: Allocated<Self>,
            set: &NSArray<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(initWithSet:))]
        #[unsafe(method_family = init)]
        pub fn initWithSet(this: Allocated<Self>, set: &NSSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(initWithSet:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithSet_copyItems(
            this: Allocated<Self>,
            set: &NSSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;
    );
}

/// Methods declared on superclass `NSOrderedSet`.
///
/// NSOrderedSetCreation.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(orderedSet))]
        #[unsafe(method_family = none)]
        pub fn orderedSet() -> Retained<Self>;

        #[unsafe(method(orderedSetWithObject:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithObject(object: &ObjectType) -> Retained<Self>;

        /// # Safety
        ///
        /// `objects` must be a valid pointer.
        #[unsafe(method(orderedSetWithObjects:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithObjects_count(
            objects: NonNull<NonNull<ObjectType>>,
            cnt: NSUInteger,
        ) -> Retained<Self>;

        #[unsafe(method(orderedSetWithOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithOrderedSet(set: &NSOrderedSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSRange")]
        #[unsafe(method(orderedSetWithOrderedSet:range:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithOrderedSet_range_copyItems(
            set: &NSOrderedSet<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(orderedSetWithArray:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithArray(array: &NSArray<ObjectType>) -> Retained<Self>;

        #[cfg(all(feature = "NSArray", feature = "NSRange"))]
        #[unsafe(method(orderedSetWithArray:range:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithArray_range_copyItems(
            array: &NSArray<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(orderedSetWithSet:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithSet(set: &NSSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(orderedSetWithSet:copyItems:))]
        #[unsafe(method_family = none)]
        pub unsafe fn orderedSetWithSet_copyItems(
            set: &NSSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[unsafe(method(initWithObject:))]
        #[unsafe(method_family = init)]
        pub fn initWithObject(this: Allocated<Self>, object: &ObjectType) -> Retained<Self>;

        #[unsafe(method(initWithOrderedSet:))]
        #[unsafe(method_family = init)]
        pub fn initWithOrderedSet(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
        ) -> Retained<Self>;

        #[unsafe(method(initWithOrderedSet:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithOrderedSet_copyItems(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSRange")]
        #[unsafe(method(initWithOrderedSet:range:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithOrderedSet_range_copyItems(
            this: Allocated<Self>,
            set: &NSOrderedSet<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(initWithArray:))]
        #[unsafe(method_family = init)]
        pub fn initWithArray(this: Allocated<Self>, array: &NSArray<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSArray")]
        #[unsafe(method(initWithArray:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithArray_copyItems(
            this: Allocated<Self>,
            set: &NSArray<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(all(feature = "NSArray", feature = "NSRange"))]
        #[unsafe(method(initWithArray:range:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithArray_range_copyItems(
            this: Allocated<Self>,
            set: &NSArray<ObjectType>,
            range: NSRange,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(initWithSet:))]
        #[unsafe(method_family = init)]
        pub fn initWithSet(this: Allocated<Self>, set: &NSSet<ObjectType>) -> Retained<Self>;

        #[cfg(feature = "NSSet")]
        #[unsafe(method(initWithSet:copyItems:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithSet_copyItems(
            this: Allocated<Self>,
            set: &NSSet<ObjectType>,
            flag: bool,
        ) -> Retained<Self>;
    );
}

/// NSOrderedSetDiffing.
impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[cfg(all(feature = "NSOrderedCollectionDifference", feature = "block2"))]
        #[unsafe(method(differenceFromOrderedSet:withOptions:usingEquivalenceTest:))]
        #[unsafe(method_family = none)]
        pub fn differenceFromOrderedSet_withOptions_usingEquivalenceTest(
            &self,
            other: &NSOrderedSet<ObjectType>,
            options: NSOrderedCollectionDifferenceCalculationOptions,
            block: &block2::DynBlock<dyn Fn(NonNull<ObjectType>, NonNull<ObjectType>) -> Bool + '_>,
        ) -> Retained<NSOrderedCollectionDifference<ObjectType>>;

        #[cfg(feature = "NSOrderedCollectionDifference")]
        #[unsafe(method(differenceFromOrderedSet:withOptions:))]
        #[unsafe(method_family = none)]
        pub fn differenceFromOrderedSet_withOptions(
            &self,
            other: &NSOrderedSet<ObjectType>,
            options: NSOrderedCollectionDifferenceCalculationOptions,
        ) -> Retained<NSOrderedCollectionDifference<ObjectType>>;

        #[cfg(feature = "NSOrderedCollectionDifference")]
        #[unsafe(method(differenceFromOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn differenceFromOrderedSet(
            &self,
            other: &NSOrderedSet<ObjectType>,
        ) -> Retained<NSOrderedCollectionDifference<ObjectType>>;

        #[cfg(feature = "NSOrderedCollectionDifference")]
        #[unsafe(method(orderedSetByApplyingDifference:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetByApplyingDifference(
            &self,
            difference: &NSOrderedCollectionDifference<ObjectType>,
        ) -> Option<Retained<NSOrderedSet<ObjectType>>>;
    );
}

extern_class!(
    /// **************       Mutable Ordered Set     ***************
    ///
    /// See also [Apple's documentation](https://developer.apple.com/documentation/foundation/nsmutableorderedset?language=objc)
    #[unsafe(super(NSOrderedSet<ObjectType>, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSMutableOrderedSet<ObjectType: ?Sized = AnyObject>;
);

impl<ObjectType: ?Sized + Message> NSMutableOrderedSet<ObjectType> {
    /// Unchecked conversion of the generic parameter.
    ///
    /// # Safety
    ///
    /// The generic must be valid to reinterpret as the given type.
    #[inline]
    pub unsafe fn cast_unchecked<NewObjectType: ?Sized + Message>(
        &self,
    ) -> &NSMutableOrderedSet<NewObjectType> {
        unsafe { &*((self as *const Self).cast()) }
    }
}

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized + NSCoding> NSCoding for NSMutableOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSCopying for NSMutableOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
unsafe impl<ObjectType: ?Sized + Message> CopyingHelper for NSMutableOrderedSet<ObjectType> {
    type Result = NSOrderedSet<ObjectType>;
}

#[cfg(feature = "NSEnumerator")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSFastEnumeration for NSMutableOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSMutableCopying for NSMutableOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
unsafe impl<ObjectType: ?Sized + Message> MutableCopyingHelper for NSMutableOrderedSet<ObjectType> {
    type Result = Self;
}

extern_conformance!(
    unsafe impl<ObjectType: ?Sized> NSObjectProtocol for NSMutableOrderedSet<ObjectType> {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl<ObjectType: ?Sized + NSSecureCoding> NSSecureCoding
        for NSMutableOrderedSet<ObjectType>
    {
    }
);

impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(insertObject:atIndex:))]
        #[unsafe(method_family = none)]
        pub fn insertObject_atIndex(&self, object: &ObjectType, idx: NSUInteger);

        #[unsafe(method(removeObjectAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn removeObjectAtIndex(&self, idx: NSUInteger);

        #[unsafe(method(replaceObjectAtIndex:withObject:))]
        #[unsafe(method_family = none)]
        pub fn replaceObjectAtIndex_withObject(&self, idx: NSUInteger, object: &ObjectType);

        #[cfg(feature = "NSCoder")]
        /// # Safety
        ///
        /// `coder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(initWithCapacity:))]
        #[unsafe(method_family = init)]
        pub fn initWithCapacity(this: Allocated<Self>, num_items: NSUInteger) -> Retained<Self>;
    );
}

/// Methods declared on superclass `NSOrderedSet`.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        /// # Safety
        ///
        /// `objects` must be a valid pointer or null.
        #[unsafe(method(initWithObjects:count:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithObjects_count(
            this: Allocated<Self>,
            objects: *mut NonNull<ObjectType>,
            cnt: NSUInteger,
        ) -> Retained<Self>;
    );
}

/// Methods declared on superclass `NSObject`.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl<ObjectType: Message> DefaultRetained for NSMutableOrderedSet<ObjectType> {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

/// NSExtendedMutableOrderedSet.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(addObject:))]
        #[unsafe(method_family = none)]
        pub fn addObject(&self, object: &ObjectType);

        /// # Safety
        ///
        /// `objects` must be a valid pointer or null.
        #[unsafe(method(addObjects:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn addObjects_count(&self, objects: *mut NonNull<ObjectType>, count: NSUInteger);

        #[cfg(feature = "NSArray")]
        #[unsafe(method(addObjectsFromArray:))]
        #[unsafe(method_family = none)]
        pub fn addObjectsFromArray(&self, array: &NSArray<ObjectType>);

        #[unsafe(method(exchangeObjectAtIndex:withObjectAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn exchangeObjectAtIndex_withObjectAtIndex(&self, idx1: NSUInteger, idx2: NSUInteger);

        #[cfg(feature = "NSIndexSet")]
        #[unsafe(method(moveObjectsAtIndexes:toIndex:))]
        #[unsafe(method_family = none)]
        pub fn moveObjectsAtIndexes_toIndex(&self, indexes: &NSIndexSet, idx: NSUInteger);

        #[cfg(all(feature = "NSArray", feature = "NSIndexSet"))]
        #[unsafe(method(insertObjects:atIndexes:))]
        #[unsafe(method_family = none)]
        pub fn insertObjects_atIndexes(&self, objects: &NSArray<ObjectType>, indexes: &NSIndexSet);

        #[unsafe(method(setObject:atIndex:))]
        #[unsafe(method_family = none)]
        pub fn setObject_atIndex(&self, obj: &ObjectType, idx: NSUInteger);

        #[unsafe(method(setObject:atIndexedSubscript:))]
        #[unsafe(method_family = none)]
        pub fn setObject_atIndexedSubscript(&self, obj: &ObjectType, idx: NSUInteger);

        #[cfg(feature = "NSRange")]
        /// # Safety
        ///
        /// `objects` must be a valid pointer or null.
        #[unsafe(method(replaceObjectsInRange:withObjects:count:))]
        #[unsafe(method_family = none)]
        pub unsafe fn replaceObjectsInRange_withObjects_count(
            &self,
            range: NSRange,
            objects: *mut NonNull<ObjectType>,
            count: NSUInteger,
        );

        #[cfg(all(feature = "NSArray", feature = "NSIndexSet"))]
        #[unsafe(method(replaceObjectsAtIndexes:withObjects:))]
        #[unsafe(method_family = none)]
        pub fn replaceObjectsAtIndexes_withObjects(
            &self,
            indexes: &NSIndexSet,
            objects: &NSArray<ObjectType>,
        );

        #[cfg(feature = "NSRange")]
        #[unsafe(method(removeObjectsInRange:))]
        #[unsafe(method_family = none)]
        pub fn removeObjectsInRange(&self, range: NSRange);

        #[cfg(feature = "NSIndexSet")]
        #[unsafe(method(removeObjectsAtIndexes:))]
        #[unsafe(method_family = none)]
        pub fn removeObjectsAtIndexes(&self, indexes: &NSIndexSet);

        #[unsafe(method(removeAllObjects))]
        #[unsafe(method_family = none)]
        pub fn removeAllObjects(&self);

        #[unsafe(method(removeObject:))]
        #[unsafe(method_family = none)]
        pub fn removeObject(&self, object: &ObjectType);

        #[cfg(feature = "NSArray")]
        #[unsafe(method(removeObjectsInArray:))]
        #[unsafe(method_family = none)]
        pub fn removeObjectsInArray(&self, array: &NSArray<ObjectType>);

        #[unsafe(method(intersectOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn intersectOrderedSet(&self, other: &NSOrderedSet<ObjectType>);

        #[unsafe(method(minusOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn minusOrderedSet(&self, other: &NSOrderedSet<ObjectType>);

        #[unsafe(method(unionOrderedSet:))]
        #[unsafe(method_family = none)]
        pub fn unionOrderedSet(&self, other: &NSOrderedSet<ObjectType>);

        #[cfg(feature = "NSSet")]
        #[unsafe(method(intersectSet:))]
        #[unsafe(method_family = none)]
        pub fn intersectSet(&self, other: &NSSet<ObjectType>);

        #[cfg(feature = "NSSet")]
        #[unsafe(method(minusSet:))]
        #[unsafe(method_family = none)]
        pub fn minusSet(&self, other: &NSSet<ObjectType>);

        #[cfg(feature = "NSSet")]
        #[unsafe(method(unionSet:))]
        #[unsafe(method_family = none)]
        pub fn unionSet(&self, other: &NSSet<ObjectType>);

        #[cfg(all(feature = "NSObjCRuntime", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortUsingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortUsingComparator(&self, cmptr: NSComparator);

        #[cfg(all(feature = "NSObjCRuntime", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortWithOptions:usingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortWithOptions_usingComparator(
            &self,
            opts: NSSortOptions,
            cmptr: NSComparator,
        );

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSRange", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortRange:options:usingComparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortRange_options_usingComparator(
            &self,
            range: NSRange,
            opts: NSSortOptions,
            cmptr: NSComparator,
        );
    );
}

/// NSMutableOrderedSetCreation.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[unsafe(method(orderedSetWithCapacity:))]
        #[unsafe(method_family = none)]
        pub fn orderedSetWithCapacity(num_items: NSUInteger) -> Retained<Self>;
    );
}

/// NSMutableOrderedSetDiffing.
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[cfg(feature = "NSOrderedCollectionDifference")]
        #[unsafe(method(applyDifference:))]
        #[unsafe(method_family = none)]
        pub fn applyDifference(&self, difference: &NSOrderedCollectionDifference<ObjectType>);
    );
}
