//! 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/nsvalue?language=objc)
    #[unsafe(super(NSObject))]

    pub struct NSValue;
);

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

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

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

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

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

impl NSValue {
    extern_methods!(
        /// # Safety
        ///
        /// `value` must be a valid pointer.
        #[unsafe(method(getValue:size:))]
        #[unsafe(method_family = none)]
        pub unsafe fn getValue_size(&self, value: NonNull<c_void>, size: NSUInteger);

        #[unsafe(method(objCType))]
        #[unsafe(method_family = none)]
        pub fn objCType(&self) -> NonNull<c_char>;

        /// # Safety
        ///
        /// - `value` must be a valid pointer.
        /// - `type` must be a valid pointer.
        #[unsafe(method(initWithBytes:objCType:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithBytes_objCType(
            this: Allocated<Self>,
            value: NonNull<c_void>,
            r#type: NonNull<c_char>,
        ) -> 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>>;
    );
}

/// NSValueCreation.
impl NSValue {
    extern_methods!(
        /// # Safety
        ///
        /// - `value` must be a valid pointer.
        /// - `type` must be a valid pointer.
        #[unsafe(method(valueWithBytes:objCType:))]
        #[unsafe(method_family = none)]
        pub unsafe fn valueWithBytes_objCType(
            value: NonNull<c_void>,
            r#type: NonNull<c_char>,
        ) -> Retained<NSValue>;

        /// # Safety
        ///
        /// - `value` must be a valid pointer.
        /// - `type` must be a valid pointer.
        #[unsafe(method(value:withObjCType:))]
        #[unsafe(method_family = none)]
        pub unsafe fn value_withObjCType(
            value: NonNull<c_void>,
            r#type: NonNull<c_char>,
        ) -> Retained<NSValue>;
    );
}

/// NSValueExtensionMethods.
impl NSValue {
    extern_methods!(
        /// # Safety
        ///
        /// `an_object` should be of the correct type.
        #[unsafe(method(valueWithNonretainedObject:))]
        #[unsafe(method_family = none)]
        pub unsafe fn valueWithNonretainedObject(
            an_object: Option<&AnyObject>,
        ) -> Retained<NSValue>;

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

        /// # Safety
        ///
        /// `pointer` must be a valid pointer or null.
        #[unsafe(method(valueWithPointer:))]
        #[unsafe(method_family = none)]
        pub unsafe fn valueWithPointer(pointer: *const c_void) -> Retained<NSValue>;

        #[unsafe(method(pointerValue))]
        #[unsafe(method_family = none)]
        pub unsafe fn pointerValue(&self) -> *mut c_void;

        #[unsafe(method(isEqualToValue:))]
        #[unsafe(method_family = none)]
        pub fn isEqualToValue(&self, value: &NSValue) -> bool;
    );
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsnumber?language=objc)
    #[unsafe(super(NSValue, NSObject))]

    pub struct NSNumber;
);

unsafe impl Send for NSNumber {}

unsafe impl Sync for NSNumber {}

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

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

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

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

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

impl NSNumber {
    extern_methods!(
        #[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(initWithChar:))]
        #[unsafe(method_family = init)]
        pub fn initWithChar(this: Allocated<Self>, value: c_char) -> Retained<NSNumber>;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        #[cfg(feature = "NSObjCRuntime")]
        #[unsafe(method(compare:))]
        #[unsafe(method_family = none)]
        pub fn compare(&self, other_number: &NSNumber) -> NSComparisonResult;

        #[unsafe(method(isEqualToNumber:))]
        #[unsafe(method_family = none)]
        pub fn isEqualToNumber(&self, number: &NSNumber) -> bool;

        #[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>;
    );
}

/// Methods declared on superclass `NSValue`.
impl NSNumber {
    extern_methods!(
        /// # Safety
        ///
        /// - `value` must be a valid pointer.
        /// - `type` must be a valid pointer.
        #[unsafe(method(initWithBytes:objCType:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithBytes_objCType(
            this: Allocated<Self>,
            value: NonNull<c_void>,
            r#type: NonNull<c_char>,
        ) -> Retained<Self>;
    );
}

/// NSNumberCreation.
impl NSNumber {
    extern_methods!(
        #[unsafe(method(numberWithChar:))]
        #[unsafe(method_family = none)]
        pub fn numberWithChar(value: c_char) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedChar:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedChar(value: c_uchar) -> Retained<NSNumber>;

        #[unsafe(method(numberWithShort:))]
        #[unsafe(method_family = none)]
        pub fn numberWithShort(value: c_short) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedShort:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedShort(value: c_ushort) -> Retained<NSNumber>;

        #[unsafe(method(numberWithInt:))]
        #[unsafe(method_family = none)]
        pub fn numberWithInt(value: c_int) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedInt:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedInt(value: c_uint) -> Retained<NSNumber>;

        #[unsafe(method(numberWithLong:))]
        #[unsafe(method_family = none)]
        pub fn numberWithLong(value: c_long) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedLong:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedLong(value: c_ulong) -> Retained<NSNumber>;

        #[unsafe(method(numberWithLongLong:))]
        #[unsafe(method_family = none)]
        pub fn numberWithLongLong(value: c_longlong) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedLongLong:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedLongLong(value: c_ulonglong) -> Retained<NSNumber>;

        #[unsafe(method(numberWithFloat:))]
        #[unsafe(method_family = none)]
        pub fn numberWithFloat(value: c_float) -> Retained<NSNumber>;

        #[unsafe(method(numberWithDouble:))]
        #[unsafe(method_family = none)]
        pub fn numberWithDouble(value: c_double) -> Retained<NSNumber>;

        #[unsafe(method(numberWithBool:))]
        #[unsafe(method_family = none)]
        pub fn numberWithBool(value: bool) -> Retained<NSNumber>;

        #[unsafe(method(numberWithInteger:))]
        #[unsafe(method_family = none)]
        pub fn numberWithInteger(value: NSInteger) -> Retained<NSNumber>;

        #[unsafe(method(numberWithUnsignedInteger:))]
        #[unsafe(method_family = none)]
        pub fn numberWithUnsignedInteger(value: NSUInteger) -> Retained<NSNumber>;
    );
}

/// NSDeprecated.
impl NSValue {
    extern_methods!(
        /// # Safety
        ///
        /// `value` must be a valid pointer.
        #[deprecated]
        #[unsafe(method(getValue:))]
        #[unsafe(method_family = none)]
        pub unsafe fn getValue(&self, value: NonNull<c_void>);
    );
}
