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

use crate::*;

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSDecimalNumberExactnessException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSDecimalNumberOverflowException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSDecimalNumberUnderflowException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSDecimalNumberDivideByZeroException: &'static NSExceptionName;
}

extern_protocol!(
    pub unsafe trait NSDecimalNumberBehaviors {
        #[cfg(feature = "NSDecimal")]
        #[method(roundingMode)]
        unsafe fn roundingMode(&self) -> NSRoundingMode;

        #[method(scale)]
        unsafe fn scale(&self) -> c_short;

        #[cfg(all(feature = "NSDecimal", feature = "NSValue"))]
        #[method_id(@__retain_semantics Other exceptionDuringOperation:error:leftOperand:rightOperand:)]
        unsafe fn exceptionDuringOperation_error_leftOperand_rightOperand(
            &self,
            operation: Sel,
            error: NSCalculationError,
            left_operand: &NSDecimalNumber,
            right_operand: Option<&NSDecimalNumber>,
        ) -> Option<Retained<NSDecimalNumber>>;
    }

    unsafe impl ProtocolType for dyn NSDecimalNumberBehaviors {}
);

extern_class!(
    #[derive(Debug, PartialEq, Hash)]
    #[cfg(feature = "NSValue")]
    pub struct NSDecimalNumber;

    #[cfg(feature = "NSValue")]
    unsafe impl ClassType for NSDecimalNumber {
        #[inherits(NSValue, NSObject)]
        type Super = NSNumber;
        type Mutability = Immutable;
    }
);

#[cfg(feature = "NSValue")]
unsafe impl Send for NSDecimalNumber {}

#[cfg(feature = "NSValue")]
unsafe impl Sync for NSDecimalNumber {}

#[cfg(all(feature = "NSObject", feature = "NSValue"))]
unsafe impl NSCoding for NSDecimalNumber {}

#[cfg(all(feature = "NSObject", feature = "NSValue"))]
unsafe impl NSCopying for NSDecimalNumber {}

#[cfg(feature = "NSValue")]
unsafe impl NSObjectProtocol for NSDecimalNumber {}

#[cfg(all(feature = "NSObject", feature = "NSValue"))]
unsafe impl NSSecureCoding for NSDecimalNumber {}

extern_methods!(
    #[cfg(feature = "NSValue")]
    unsafe impl NSDecimalNumber {
        #[method_id(@__retain_semantics Init initWithMantissa:exponent:isNegative:)]
        pub unsafe fn initWithMantissa_exponent_isNegative(
            this: Allocated<Self>,
            mantissa: c_ulonglong,
            exponent: c_short,
            flag: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSDecimal")]
        #[method_id(@__retain_semantics Init initWithDecimal:)]
        pub unsafe fn initWithDecimal(this: Allocated<Self>, dcm: NSDecimal) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Init initWithString:)]
        pub unsafe fn initWithString(
            this: Allocated<Self>,
            number_value: Option<&NSString>,
        ) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Init initWithString:locale:)]
        pub unsafe fn initWithString_locale(
            this: Allocated<Self>,
            number_value: Option<&NSString>,
            locale: Option<&AnyObject>,
        ) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other descriptionWithLocale:)]
        pub unsafe fn descriptionWithLocale(
            &self,
            locale: Option<&AnyObject>,
        ) -> Retained<NSString>;

        #[cfg(feature = "NSDecimal")]
        #[method(decimalValue)]
        pub unsafe fn decimalValue(&self) -> NSDecimal;

        #[method_id(@__retain_semantics Other decimalNumberWithMantissa:exponent:isNegative:)]
        pub unsafe fn decimalNumberWithMantissa_exponent_isNegative(
            mantissa: c_ulonglong,
            exponent: c_short,
            flag: bool,
        ) -> Retained<NSDecimalNumber>;

        #[cfg(feature = "NSDecimal")]
        #[method_id(@__retain_semantics Other decimalNumberWithDecimal:)]
        pub unsafe fn decimalNumberWithDecimal(dcm: NSDecimal) -> Retained<NSDecimalNumber>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other decimalNumberWithString:)]
        pub unsafe fn decimalNumberWithString(
            number_value: Option<&NSString>,
        ) -> Retained<NSDecimalNumber>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other decimalNumberWithString:locale:)]
        pub unsafe fn decimalNumberWithString_locale(
            number_value: Option<&NSString>,
            locale: Option<&AnyObject>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other zero)]
        pub unsafe fn zero() -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other one)]
        pub unsafe fn one() -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other minimumDecimalNumber)]
        pub unsafe fn minimumDecimalNumber() -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other maximumDecimalNumber)]
        pub unsafe fn maximumDecimalNumber() -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other notANumber)]
        pub unsafe fn notANumber() -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByAdding:)]
        pub unsafe fn decimalNumberByAdding(
            &self,
            decimal_number: &NSDecimalNumber,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByAdding:withBehavior:)]
        pub unsafe fn decimalNumberByAdding_withBehavior(
            &self,
            decimal_number: &NSDecimalNumber,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberBySubtracting:)]
        pub unsafe fn decimalNumberBySubtracting(
            &self,
            decimal_number: &NSDecimalNumber,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberBySubtracting:withBehavior:)]
        pub unsafe fn decimalNumberBySubtracting_withBehavior(
            &self,
            decimal_number: &NSDecimalNumber,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByMultiplyingBy:)]
        pub unsafe fn decimalNumberByMultiplyingBy(
            &self,
            decimal_number: &NSDecimalNumber,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByMultiplyingBy:withBehavior:)]
        pub unsafe fn decimalNumberByMultiplyingBy_withBehavior(
            &self,
            decimal_number: &NSDecimalNumber,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByDividingBy:)]
        pub unsafe fn decimalNumberByDividingBy(
            &self,
            decimal_number: &NSDecimalNumber,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByDividingBy:withBehavior:)]
        pub unsafe fn decimalNumberByDividingBy_withBehavior(
            &self,
            decimal_number: &NSDecimalNumber,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByRaisingToPower:)]
        pub unsafe fn decimalNumberByRaisingToPower(
            &self,
            power: NSUInteger,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByRaisingToPower:withBehavior:)]
        pub unsafe fn decimalNumberByRaisingToPower_withBehavior(
            &self,
            power: NSUInteger,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByMultiplyingByPowerOf10:)]
        pub unsafe fn decimalNumberByMultiplyingByPowerOf10(
            &self,
            power: c_short,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByMultiplyingByPowerOf10:withBehavior:)]
        pub unsafe fn decimalNumberByMultiplyingByPowerOf10_withBehavior(
            &self,
            power: c_short,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

        #[method_id(@__retain_semantics Other decimalNumberByRoundingAccordingToBehavior:)]
        pub unsafe fn decimalNumberByRoundingAccordingToBehavior(
            &self,
            behavior: Option<&ProtocolObject<dyn NSDecimalNumberBehaviors>>,
        ) -> Retained<NSDecimalNumber>;

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

        #[method_id(@__retain_semantics Other defaultBehavior)]
        pub unsafe fn defaultBehavior() -> Retained<ProtocolObject<dyn NSDecimalNumberBehaviors>>;

        #[method(setDefaultBehavior:)]
        pub unsafe fn setDefaultBehavior(
            default_behavior: &ProtocolObject<dyn NSDecimalNumberBehaviors>,
        );

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

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

extern_methods!(
    /// Methods declared on superclass `NSNumber`
    #[cfg(feature = "NSValue")]
    unsafe impl NSDecimalNumber {
        #[cfg(feature = "NSCoder")]
        #[method_id(@__retain_semantics Init initWithCoder:)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSValue`
    #[cfg(feature = "NSValue")]
    unsafe impl NSDecimalNumber {
        #[method_id(@__retain_semantics Init initWithBytes:objCType:)]
        pub unsafe fn initWithBytes_objCType(
            this: Allocated<Self>,
            value: NonNull<c_void>,
            r#type: NonNull<c_char>,
        ) -> Retained<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "NSValue")]
    unsafe impl NSDecimalNumber {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSDecimalNumberHandler;

    unsafe impl ClassType for NSDecimalNumberHandler {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

unsafe impl Send for NSDecimalNumberHandler {}

unsafe impl Sync for NSDecimalNumberHandler {}

#[cfg(feature = "NSObject")]
unsafe impl NSCoding for NSDecimalNumberHandler {}

unsafe impl NSDecimalNumberBehaviors for NSDecimalNumberHandler {}

unsafe impl NSObjectProtocol for NSDecimalNumberHandler {}

extern_methods!(
    unsafe impl NSDecimalNumberHandler {
        #[method_id(@__retain_semantics Other defaultDecimalNumberHandler)]
        pub unsafe fn defaultDecimalNumberHandler() -> Retained<NSDecimalNumberHandler>;

        #[cfg(feature = "NSDecimal")]
        #[method_id(@__retain_semantics Init initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:)]
        pub unsafe fn initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero(
            this: Allocated<Self>,
            rounding_mode: NSRoundingMode,
            scale: c_short,
            exact: bool,
            overflow: bool,
            underflow: bool,
            divide_by_zero: bool,
        ) -> Retained<Self>;

        #[cfg(feature = "NSDecimal")]
        #[method_id(@__retain_semantics Other decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:)]
        pub unsafe fn decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero(
            rounding_mode: NSRoundingMode,
            scale: c_short,
            exact: bool,
            overflow: bool,
            underflow: bool,
            divide_by_zero: bool,
        ) -> Retained<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSDecimalNumberHandler {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);

extern_methods!(
    /// NSDecimalNumberExtensions
    #[cfg(feature = "NSValue")]
    unsafe impl NSNumber {
        #[cfg(feature = "NSDecimal")]
        #[method(decimalValue)]
        pub unsafe fn decimalValue(&self) -> NSDecimal;
    }
);

extern_methods!(
    /// NSDecimalNumberScanning
    #[cfg(feature = "NSScanner")]
    unsafe impl NSScanner {
        #[cfg(feature = "NSDecimal")]
        #[method(scanDecimal:)]
        pub unsafe fn scanDecimal(&self, dcm: *mut NSDecimal) -> bool;
    }
);
