//! 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!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nssortdescriptor?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSSortDescriptor;
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCoding for NSSortDescriptor {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSSortDescriptor {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSSortDescriptor {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSSortDescriptor {}
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSSecureCoding for NSSortDescriptor {}
);

impl NSSortDescriptor {
    extern_methods!(
        #[cfg(feature = "NSString")]
        #[unsafe(method(sortDescriptorWithKey:ascending:))]
        #[unsafe(method_family = none)]
        pub fn sortDescriptorWithKey_ascending(
            key: Option<&NSString>,
            ascending: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        /// # Safety
        ///
        /// `selector` must be a valid selector.
        #[unsafe(method(sortDescriptorWithKey:ascending:selector:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortDescriptorWithKey_ascending_selector(
            key: Option<&NSString>,
            ascending: bool,
            selector: Option<Sel>,
        ) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(initWithKey:ascending:))]
        #[unsafe(method_family = init)]
        pub fn initWithKey_ascending(
            this: Allocated<Self>,
            key: Option<&NSString>,
            ascending: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        /// # Safety
        ///
        /// `selector` must be a valid selector.
        #[unsafe(method(initWithKey:ascending:selector:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithKey_ascending_selector(
            this: Allocated<Self>,
            key: Option<&NSString>,
            ascending: bool,
            selector: Option<Sel>,
        ) -> 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>>;

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

        #[unsafe(method(ascending))]
        #[unsafe(method_family = none)]
        pub fn ascending(&self) -> bool;

        #[unsafe(method(selector))]
        #[unsafe(method_family = none)]
        pub fn selector(&self) -> Option<Sel>;

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

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSString", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(sortDescriptorWithKey:ascending:comparator:))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortDescriptorWithKey_ascending_comparator(
            key: Option<&NSString>,
            ascending: bool,
            cmptr: NSComparator,
        ) -> Retained<Self>;

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSString", feature = "block2"))]
        /// # Safety
        ///
        /// `cmptr` must be a valid pointer.
        #[unsafe(method(initWithKey:ascending:comparator:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithKey_ascending_comparator(
            this: Allocated<Self>,
            key: Option<&NSString>,
            ascending: bool,
            cmptr: NSComparator,
        ) -> Retained<Self>;

        #[cfg(all(feature = "NSObjCRuntime", feature = "block2"))]
        /// # Safety
        ///
        /// - The returned block's argument 1 must be a valid pointer.
        /// - The returned block's argument 2 must be a valid pointer.
        #[unsafe(method(comparator))]
        #[unsafe(method_family = none)]
        pub unsafe fn comparator(&self) -> NSComparator;

        #[cfg(feature = "NSObjCRuntime")]
        /// # Safety
        ///
        /// - `object1` should be of the correct type.
        /// - `object2` should be of the correct type.
        #[unsafe(method(compareObject:toObject:))]
        #[unsafe(method_family = none)]
        pub unsafe fn compareObject_toObject(
            &self,
            object1: &AnyObject,
            object2: &AnyObject,
        ) -> NSComparisonResult;

        #[unsafe(method(reversedSortDescriptor))]
        #[unsafe(method_family = none)]
        pub fn reversedSortDescriptor(&self) -> Retained<AnyObject>;
    );
}

/// Methods declared on superclass `NSObject`.
impl NSSortDescriptor {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

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

/// NSSortDescriptorSorting.
#[cfg(feature = "NSSet")]
impl<ObjectType: Message> NSSet<ObjectType> {
    extern_methods!(
        #[cfg(feature = "NSArray")]
        #[unsafe(method(sortedArrayUsingDescriptors:))]
        #[unsafe(method_family = none)]
        pub fn sortedArrayUsingDescriptors(
            &self,
            sort_descriptors: &NSArray<NSSortDescriptor>,
        ) -> Retained<NSArray<ObjectType>>;
    );
}

/// NSSortDescriptorSorting.
#[cfg(feature = "NSArray")]
impl<ObjectType: Message> NSArray<ObjectType> {
    extern_methods!(
        #[unsafe(method(sortedArrayUsingDescriptors:))]
        #[unsafe(method_family = none)]
        pub fn sortedArrayUsingDescriptors(
            &self,
            sort_descriptors: &NSArray<NSSortDescriptor>,
        ) -> Retained<NSArray<ObjectType>>;
    );
}

/// NSSortDescriptorSorting.
#[cfg(feature = "NSArray")]
impl<ObjectType: Message> NSMutableArray<ObjectType> {
    extern_methods!(
        #[unsafe(method(sortUsingDescriptors:))]
        #[unsafe(method_family = none)]
        pub fn sortUsingDescriptors(&self, sort_descriptors: &NSArray<NSSortDescriptor>);
    );
}

/// NSKeyValueSorting.
#[cfg(feature = "NSOrderedSet")]
impl<ObjectType: Message> NSOrderedSet<ObjectType> {
    extern_methods!(
        #[cfg(feature = "NSArray")]
        #[unsafe(method(sortedArrayUsingDescriptors:))]
        #[unsafe(method_family = none)]
        pub fn sortedArrayUsingDescriptors(
            &self,
            sort_descriptors: &NSArray<NSSortDescriptor>,
        ) -> Retained<NSArray<ObjectType>>;
    );
}

/// NSKeyValueSorting.
#[cfg(feature = "NSOrderedSet")]
impl<ObjectType: Message> NSMutableOrderedSet<ObjectType> {
    extern_methods!(
        #[cfg(feature = "NSArray")]
        #[unsafe(method(sortUsingDescriptors:))]
        #[unsafe(method_family = none)]
        pub fn sortUsingDescriptors(&self, sort_descriptors: &NSArray<NSSortDescriptor>);
    );
}
