//! 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::*;
#[cfg(feature = "objc2-foundation")]
use objc2_foundation::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykey?language=objc)
// NS_TYPED_ENUM
#[cfg(feature = "objc2-foundation")]
pub type IOSurfacePropertyKey = NSString;

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyallocsize?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyAllocSize: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeywidth?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyWidth: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyheight?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyHeight: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeybytesperrow?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyBytesPerRow: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeybytesperelement?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyBytesPerElement: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyelementwidth?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyElementWidth: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyelementheight?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyElementHeight: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyoffset?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyOffset: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplaneinfo?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneInfo: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplanewidth?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneWidth: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplaneheight?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneHeight: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplanebytesperrow?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneBytesPerRow: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplaneoffset?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneOffset: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplanesize?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneSize: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplanebase?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneBase: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplanebytesperelement?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneBytesPerElement: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplaneelementwidth?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneElementWidth: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyplaneelementheight?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPlaneElementHeight: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeycachemode?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyCacheMode: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeypixelformat?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPixelFormat: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeypixelsizecastingallowed?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyPixelSizeCastingAllowed: &'static IOSurfacePropertyKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertykeyname?language=objc)
    #[cfg(feature = "objc2-foundation")]
    pub static IOSurfacePropertyKeyName: &'static IOSurfacePropertyKey;
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurface?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct IOSurface;
);

unsafe impl Send for IOSurface {}

unsafe impl Sync for IOSurface {}

#[cfg(feature = "objc2-foundation")]
extern_conformance!(
    unsafe impl NSCoding for IOSurface {}
);

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

#[cfg(feature = "objc2-foundation")]
extern_conformance!(
    unsafe impl NSSecureCoding for IOSurface {}
);

impl IOSurface {
    extern_methods!(
        #[cfg(feature = "objc2-foundation")]
        #[unsafe(method(initWithProperties:))]
        #[unsafe(method_family = init)]
        pub fn initWithProperties(
            this: Allocated<Self>,
            properties: &NSDictionary<IOSurfacePropertyKey, AnyObject>,
        ) -> Option<Retained<Self>>;

        #[cfg(all(feature = "IOSurfaceTypes", feature = "libc"))]
        #[unsafe(method(lockWithOptions:seed:))]
        #[unsafe(method_family = none)]
        pub fn lockWithOptions_seed(
            &self,
            options: IOSurfaceLockOptions,
            seed: *mut u32,
        ) -> libc::kern_return_t;

        #[cfg(all(feature = "IOSurfaceTypes", feature = "libc"))]
        #[unsafe(method(unlockWithOptions:seed:))]
        #[unsafe(method_family = none)]
        pub fn unlockWithOptions_seed(
            &self,
            options: IOSurfaceLockOptions,
            seed: *mut u32,
        ) -> libc::kern_return_t;

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

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

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

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

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

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

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

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

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

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

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

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

        #[unsafe(method(widthOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn widthOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(heightOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn heightOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(bytesPerRowOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn bytesPerRowOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(bytesPerElementOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn bytesPerElementOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(elementWidthOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn elementWidthOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(elementHeightOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn elementHeightOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NSInteger;

        #[unsafe(method(baseAddressOfPlaneAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn baseAddressOfPlaneAtIndex(&self, plane_index: NSUInteger) -> NonNull<c_void>;

        #[cfg(feature = "objc2-foundation")]
        /// # Safety
        ///
        /// `an_object` should be of the correct type.
        #[unsafe(method(setAttachment:forKey:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setAttachment_forKey(&self, an_object: &AnyObject, key: &NSString);

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

        #[cfg(feature = "objc2-foundation")]
        #[unsafe(method(removeAttachmentForKey:))]
        #[unsafe(method_family = none)]
        pub fn removeAttachmentForKey(&self, key: &NSString);

        #[cfg(feature = "objc2-foundation")]
        #[unsafe(method(setAllAttachments:))]
        #[unsafe(method_family = none)]
        pub fn setAllAttachments(&self, dict: &NSDictionary<NSString, AnyObject>);

        #[cfg(feature = "objc2-foundation")]
        #[unsafe(method(allAttachments))]
        #[unsafe(method_family = none)]
        pub fn allAttachments(&self) -> Option<Retained<NSDictionary<NSString, AnyObject>>>;

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

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

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

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

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

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

        #[cfg(all(feature = "IOSurfaceTypes", feature = "libc"))]
        /// # Safety
        ///
        /// `old_state` must be a valid pointer or null.
        #[unsafe(method(setPurgeable:oldState:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setPurgeable_oldState(
            &self,
            new_state: IOSurfacePurgeabilityState,
            old_state: *mut IOSurfacePurgeabilityState,
        ) -> libc::kern_return_t;
    );
}

/// Methods declared on superclass `NSObject`.
impl IOSurface {
    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 IOSurface {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/iosurface/iosurfacepropertyallocsizekey?language=objc)
    #[cfg(feature = "objc2-foundation")]
    #[deprecated]
    pub static IOSurfacePropertyAllocSizeKey: &'static IOSurfacePropertyKey;
}

// TODO: pub fn _IOSurfaceRefToObj(r#ref: &IOSurfaceRef,)-> *mut IOSurface;

// TODO: pub fn _IOSurfaceObjToRef(obj: &IOSurface,)-> Option<NonNull<IOSurfaceRef>>;
