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

use crate::*;

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct CATransform3D {
    pub m11: CGFloat,
    pub m12: CGFloat,
    pub m13: CGFloat,
    pub m14: CGFloat,
    pub m21: CGFloat,
    pub m22: CGFloat,
    pub m23: CGFloat,
    pub m24: CGFloat,
    pub m31: CGFloat,
    pub m32: CGFloat,
    pub m33: CGFloat,
    pub m34: CGFloat,
    pub m41: CGFloat,
    pub m42: CGFloat,
    pub m43: CGFloat,
    pub m44: CGFloat,
}

unsafe impl Encode for CATransform3D {
    const ENCODING: Encoding = Encoding::Struct(
        "CATransform3D",
        &[
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
            <CGFloat>::ENCODING,
        ],
    );
}

unsafe impl RefEncode for CATransform3D {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern "C" {
    pub static CATransform3DIdentity: CATransform3D;
}

#[inline]
pub extern "C" fn CATransform3DIsIdentity(t: CATransform3D) -> bool {
    extern "C" {
        fn CATransform3DIsIdentity(t: CATransform3D) -> bool;
    }
    unsafe { CATransform3DIsIdentity(t) }
}

#[inline]
pub extern "C" fn CATransform3DEqualToTransform(a: CATransform3D, b: CATransform3D) -> bool {
    extern "C" {
        fn CATransform3DEqualToTransform(a: CATransform3D, b: CATransform3D) -> bool;
    }
    unsafe { CATransform3DEqualToTransform(a, b) }
}

#[inline]
pub extern "C" fn CATransform3DMakeTranslation(
    tx: CGFloat,
    ty: CGFloat,
    tz: CGFloat,
) -> CATransform3D {
    extern "C" {
        fn CATransform3DMakeTranslation(tx: CGFloat, ty: CGFloat, tz: CGFloat) -> CATransform3D;
    }
    unsafe { CATransform3DMakeTranslation(tx, ty, tz) }
}

#[inline]
pub extern "C" fn CATransform3DMakeScale(sx: CGFloat, sy: CGFloat, sz: CGFloat) -> CATransform3D {
    extern "C" {
        fn CATransform3DMakeScale(sx: CGFloat, sy: CGFloat, sz: CGFloat) -> CATransform3D;
    }
    unsafe { CATransform3DMakeScale(sx, sy, sz) }
}

#[inline]
pub extern "C" fn CATransform3DMakeRotation(
    angle: CGFloat,
    x: CGFloat,
    y: CGFloat,
    z: CGFloat,
) -> CATransform3D {
    extern "C" {
        fn CATransform3DMakeRotation(
            angle: CGFloat,
            x: CGFloat,
            y: CGFloat,
            z: CGFloat,
        ) -> CATransform3D;
    }
    unsafe { CATransform3DMakeRotation(angle, x, y, z) }
}

#[inline]
pub extern "C" fn CATransform3DTranslate(
    t: CATransform3D,
    tx: CGFloat,
    ty: CGFloat,
    tz: CGFloat,
) -> CATransform3D {
    extern "C" {
        fn CATransform3DTranslate(
            t: CATransform3D,
            tx: CGFloat,
            ty: CGFloat,
            tz: CGFloat,
        ) -> CATransform3D;
    }
    unsafe { CATransform3DTranslate(t, tx, ty, tz) }
}

#[inline]
pub extern "C" fn CATransform3DScale(
    t: CATransform3D,
    sx: CGFloat,
    sy: CGFloat,
    sz: CGFloat,
) -> CATransform3D {
    extern "C" {
        fn CATransform3DScale(
            t: CATransform3D,
            sx: CGFloat,
            sy: CGFloat,
            sz: CGFloat,
        ) -> CATransform3D;
    }
    unsafe { CATransform3DScale(t, sx, sy, sz) }
}

#[inline]
pub extern "C" fn CATransform3DRotate(
    t: CATransform3D,
    angle: CGFloat,
    x: CGFloat,
    y: CGFloat,
    z: CGFloat,
) -> CATransform3D {
    extern "C" {
        fn CATransform3DRotate(
            t: CATransform3D,
            angle: CGFloat,
            x: CGFloat,
            y: CGFloat,
            z: CGFloat,
        ) -> CATransform3D;
    }
    unsafe { CATransform3DRotate(t, angle, x, y, z) }
}

#[inline]
pub extern "C" fn CATransform3DConcat(a: CATransform3D, b: CATransform3D) -> CATransform3D {
    extern "C" {
        fn CATransform3DConcat(a: CATransform3D, b: CATransform3D) -> CATransform3D;
    }
    unsafe { CATransform3DConcat(a, b) }
}

#[inline]
pub extern "C" fn CATransform3DInvert(t: CATransform3D) -> CATransform3D {
    extern "C" {
        fn CATransform3DInvert(t: CATransform3D) -> CATransform3D;
    }
    unsafe { CATransform3DInvert(t) }
}

#[inline]
pub extern "C" fn CATransform3DIsAffine(t: CATransform3D) -> bool {
    extern "C" {
        fn CATransform3DIsAffine(t: CATransform3D) -> bool;
    }
    unsafe { CATransform3DIsAffine(t) }
}

extern_category!(
    /// Category "CATransform3DAdditions" on [`NSValue`].
    #[doc(alias = "CATransform3DAdditions")]
    pub unsafe trait NSValueCATransform3DAdditions {
        #[method_id(@__retain_semantics Other valueWithCATransform3D:)]
        unsafe fn valueWithCATransform3D(t: CATransform3D) -> Retained<NSValue>;

        #[method(CATransform3DValue)]
        unsafe fn CATransform3DValue(&self) -> CATransform3D;
    }

    unsafe impl NSValueCATransform3DAdditions for NSValue {}
);
