/* automatically generated by rust-bindgen */

pub const DLPACK_VERSION: ::std::os::raw::c_uint = 60;
pub const _STDINT_H: ::std::os::raw::c_uint = 1;
pub const _FEATURES_H: ::std::os::raw::c_uint = 1;
pub const _DEFAULT_SOURCE: ::std::os::raw::c_uint = 1;
pub const __GLIBC_USE_ISOC2X: ::std::os::raw::c_uint = 0;
pub const __USE_ISOC11: ::std::os::raw::c_uint = 1;
pub const __USE_ISOC99: ::std::os::raw::c_uint = 1;
pub const __USE_ISOC95: ::std::os::raw::c_uint = 1;
pub const __USE_POSIX_IMPLICITLY: ::std::os::raw::c_uint = 1;
pub const _POSIX_SOURCE: ::std::os::raw::c_uint = 1;
pub const _POSIX_C_SOURCE: ::std::os::raw::c_uint = 200809;
pub const __USE_POSIX: ::std::os::raw::c_uint = 1;
pub const __USE_POSIX2: ::std::os::raw::c_uint = 1;
pub const __USE_POSIX199309: ::std::os::raw::c_uint = 1;
pub const __USE_POSIX199506: ::std::os::raw::c_uint = 1;
pub const __USE_XOPEN2K: ::std::os::raw::c_uint = 1;
pub const __USE_XOPEN2K8: ::std::os::raw::c_uint = 1;
pub const _ATFILE_SOURCE: ::std::os::raw::c_uint = 1;
pub const __USE_MISC: ::std::os::raw::c_uint = 1;
pub const __USE_ATFILE: ::std::os::raw::c_uint = 1;
pub const __USE_FORTIFY_LEVEL: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_DEPRECATED_GETS: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_DEPRECATED_SCANF: ::std::os::raw::c_uint = 0;
pub const _STDC_PREDEF_H: ::std::os::raw::c_uint = 1;
pub const __STDC_IEC_559__: ::std::os::raw::c_uint = 1;
pub const __STDC_IEC_559_COMPLEX__: ::std::os::raw::c_uint = 1;
pub const __STDC_ISO_10646__: ::std::os::raw::c_uint = 201706;
pub const __GNU_LIBRARY__: ::std::os::raw::c_uint = 6;
pub const __GLIBC__: ::std::os::raw::c_uint = 2;
pub const __GLIBC_MINOR__: ::std::os::raw::c_uint = 31;
pub const _SYS_CDEFS_H: ::std::os::raw::c_uint = 1;
pub const __glibc_c99_flexarr_available: ::std::os::raw::c_uint = 1;
pub const __WORDSIZE: ::std::os::raw::c_uint = 64;
pub const __WORDSIZE_TIME64_COMPAT32: ::std::os::raw::c_uint = 1;
pub const __SYSCALL_WORDSIZE: ::std::os::raw::c_uint = 64;
pub const __LONG_DOUBLE_USES_FLOAT128: ::std::os::raw::c_uint = 0;
pub const __HAVE_GENERIC_SELECTION: ::std::os::raw::c_uint = 1;
pub const __GLIBC_USE_LIB_EXT2: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_IEC_60559_BFP_EXT: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_IEC_60559_BFP_EXT_C2X: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_IEC_60559_FUNCS_EXT: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X: ::std::os::raw::c_uint = 0;
pub const __GLIBC_USE_IEC_60559_TYPES_EXT: ::std::os::raw::c_uint = 0;
pub const _BITS_TYPES_H: ::std::os::raw::c_uint = 1;
pub const __TIMESIZE: ::std::os::raw::c_uint = 64;
pub const _BITS_TYPESIZES_H: ::std::os::raw::c_uint = 1;
pub const __OFF_T_MATCHES_OFF64_T: ::std::os::raw::c_uint = 1;
pub const __INO_T_MATCHES_INO64_T: ::std::os::raw::c_uint = 1;
pub const __RLIM_T_MATCHES_RLIM64_T: ::std::os::raw::c_uint = 1;
pub const __STATFS_MATCHES_STATFS64: ::std::os::raw::c_uint = 1;
pub const __FD_SETSIZE: ::std::os::raw::c_uint = 1024;
pub const _BITS_TIME64_H: ::std::os::raw::c_uint = 1;
pub const _BITS_WCHAR_H: ::std::os::raw::c_uint = 1;
pub const _BITS_STDINT_INTN_H: ::std::os::raw::c_uint = 1;
pub const _BITS_STDINT_UINTN_H: ::std::os::raw::c_uint = 1;
pub const INT8_MIN: ::std::os::raw::c_int = -128;
pub const INT16_MIN: ::std::os::raw::c_int = -32768;
pub const INT32_MIN: ::std::os::raw::c_int = -2147483648;
pub const INT8_MAX: ::std::os::raw::c_uint = 127;
pub const INT16_MAX: ::std::os::raw::c_uint = 32767;
pub const INT32_MAX: ::std::os::raw::c_uint = 2147483647;
pub const UINT8_MAX: ::std::os::raw::c_uint = 255;
pub const UINT16_MAX: ::std::os::raw::c_uint = 65535;
pub const UINT32_MAX: ::std::os::raw::c_uint = 4294967295;
pub const INT_LEAST8_MIN: ::std::os::raw::c_int = -128;
pub const INT_LEAST16_MIN: ::std::os::raw::c_int = -32768;
pub const INT_LEAST32_MIN: ::std::os::raw::c_int = -2147483648;
pub const INT_LEAST8_MAX: ::std::os::raw::c_uint = 127;
pub const INT_LEAST16_MAX: ::std::os::raw::c_uint = 32767;
pub const INT_LEAST32_MAX: ::std::os::raw::c_uint = 2147483647;
pub const UINT_LEAST8_MAX: ::std::os::raw::c_uint = 255;
pub const UINT_LEAST16_MAX: ::std::os::raw::c_uint = 65535;
pub const UINT_LEAST32_MAX: ::std::os::raw::c_uint = 4294967295;
pub const INT_FAST8_MIN: ::std::os::raw::c_int = -128;
pub const INT_FAST16_MIN: ::std::os::raw::c_longlong = -9223372036854775808;
pub const INT_FAST32_MIN: ::std::os::raw::c_longlong = -9223372036854775808;
pub const INT_FAST8_MAX: ::std::os::raw::c_uint = 127;
pub const INT_FAST16_MAX: ::std::os::raw::c_ulonglong = 9223372036854775807;
pub const INT_FAST32_MAX: ::std::os::raw::c_ulonglong = 9223372036854775807;
pub const UINT_FAST8_MAX: ::std::os::raw::c_uint = 255;
pub const UINT_FAST16_MAX: ::std::os::raw::c_int = -1;
pub const UINT_FAST32_MAX: ::std::os::raw::c_int = -1;
pub const INTPTR_MIN: ::std::os::raw::c_longlong = -9223372036854775808;
pub const INTPTR_MAX: ::std::os::raw::c_ulonglong = 9223372036854775807;
pub const UINTPTR_MAX: ::std::os::raw::c_int = -1;
pub const PTRDIFF_MIN: ::std::os::raw::c_longlong = -9223372036854775808;
pub const PTRDIFF_MAX: ::std::os::raw::c_ulonglong = 9223372036854775807;
pub const SIG_ATOMIC_MIN: ::std::os::raw::c_int = -2147483648;
pub const SIG_ATOMIC_MAX: ::std::os::raw::c_uint = 2147483647;
pub const SIZE_MAX: ::std::os::raw::c_int = -1;
pub const WINT_MIN: ::std::os::raw::c_uint = 0;
pub const WINT_MAX: ::std::os::raw::c_uint = 4294967295;
pub type __u_char = ::std::os::raw::c_uchar;
pub type __u_short = ::std::os::raw::c_ushort;
pub type __u_int = ::std::os::raw::c_uint;
pub type __u_long = ::std::os::raw::c_ulong;
pub type __int8_t = ::std::os::raw::c_schar;
pub type __uint8_t = ::std::os::raw::c_uchar;
pub type __int16_t = ::std::os::raw::c_short;
pub type __uint16_t = ::std::os::raw::c_ushort;
pub type __int32_t = ::std::os::raw::c_int;
pub type __uint32_t = ::std::os::raw::c_uint;
pub type __int64_t = ::std::os::raw::c_long;
pub type __uint64_t = ::std::os::raw::c_ulong;
pub type __int_least8_t = __int8_t;
pub type __uint_least8_t = __uint8_t;
pub type __int_least16_t = __int16_t;
pub type __uint_least16_t = __uint16_t;
pub type __int_least32_t = __int32_t;
pub type __uint_least32_t = __uint32_t;
pub type __int_least64_t = __int64_t;
pub type __uint_least64_t = __uint64_t;
pub type __quad_t = ::std::os::raw::c_long;
pub type __u_quad_t = ::std::os::raw::c_ulong;
pub type __intmax_t = ::std::os::raw::c_long;
pub type __uintmax_t = ::std::os::raw::c_ulong;
pub type __dev_t = ::std::os::raw::c_ulong;
pub type __uid_t = ::std::os::raw::c_uint;
pub type __gid_t = ::std::os::raw::c_uint;
pub type __ino_t = ::std::os::raw::c_ulong;
pub type __ino64_t = ::std::os::raw::c_ulong;
pub type __mode_t = ::std::os::raw::c_uint;
pub type __nlink_t = ::std::os::raw::c_ulong;
pub type __off_t = ::std::os::raw::c_long;
pub type __off64_t = ::std::os::raw::c_long;
pub type __pid_t = ::std::os::raw::c_int;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __fsid_t {
    pub __val: [::std::os::raw::c_int; 2usize],
}
#[test]
fn bindgen_test_layout___fsid_t() {
    assert_eq!(
        ::std::mem::size_of::<__fsid_t>(),
        8usize,
        concat!("Size of: ", stringify!(__fsid_t))
    );
    assert_eq!(
        ::std::mem::align_of::<__fsid_t>(),
        4usize,
        concat!("Alignment of ", stringify!(__fsid_t))
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<__fsid_t>()).__val as *const _ as usize },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(__fsid_t),
            "::",
            stringify!(__val)
        )
    );
}
pub type __clock_t = ::std::os::raw::c_long;
pub type __rlim_t = ::std::os::raw::c_ulong;
pub type __rlim64_t = ::std::os::raw::c_ulong;
pub type __id_t = ::std::os::raw::c_uint;
pub type __time_t = ::std::os::raw::c_long;
pub type __useconds_t = ::std::os::raw::c_uint;
pub type __suseconds_t = ::std::os::raw::c_long;
pub type __daddr_t = ::std::os::raw::c_int;
pub type __key_t = ::std::os::raw::c_int;
pub type __clockid_t = ::std::os::raw::c_int;
pub type __timer_t = *mut ::std::os::raw::c_void;
pub type __blksize_t = ::std::os::raw::c_long;
pub type __blkcnt_t = ::std::os::raw::c_long;
pub type __blkcnt64_t = ::std::os::raw::c_long;
pub type __fsblkcnt_t = ::std::os::raw::c_ulong;
pub type __fsblkcnt64_t = ::std::os::raw::c_ulong;
pub type __fsfilcnt_t = ::std::os::raw::c_ulong;
pub type __fsfilcnt64_t = ::std::os::raw::c_ulong;
pub type __fsword_t = ::std::os::raw::c_long;
pub type __ssize_t = ::std::os::raw::c_long;
pub type __syscall_slong_t = ::std::os::raw::c_long;
pub type __syscall_ulong_t = ::std::os::raw::c_ulong;
pub type __loff_t = __off64_t;
pub type __caddr_t = *mut ::std::os::raw::c_char;
pub type __intptr_t = ::std::os::raw::c_long;
pub type __socklen_t = ::std::os::raw::c_uint;
pub type __sig_atomic_t = ::std::os::raw::c_int;
pub type int_least8_t = __int_least8_t;
pub type int_least16_t = __int_least16_t;
pub type int_least32_t = __int_least32_t;
pub type int_least64_t = __int_least64_t;
pub type uint_least8_t = __uint_least8_t;
pub type uint_least16_t = __uint_least16_t;
pub type uint_least32_t = __uint_least32_t;
pub type uint_least64_t = __uint_least64_t;
pub type int_fast8_t = ::std::os::raw::c_schar;
pub type int_fast16_t = ::std::os::raw::c_long;
pub type int_fast32_t = ::std::os::raw::c_long;
pub type int_fast64_t = ::std::os::raw::c_long;
pub type uint_fast8_t = ::std::os::raw::c_uchar;
pub type uint_fast16_t = ::std::os::raw::c_ulong;
pub type uint_fast32_t = ::std::os::raw::c_ulong;
pub type uint_fast64_t = ::std::os::raw::c_ulong;
pub type intmax_t = __intmax_t;
pub type uintmax_t = __uintmax_t;
pub type wchar_t = ::std::os::raw::c_int;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct max_align_t {
    pub __clang_max_align_nonce1: ::std::os::raw::c_longlong,
    pub __bindgen_padding_0: u64,
    pub __clang_max_align_nonce2: f64,
}
#[test]
fn bindgen_test_layout_max_align_t() {
    assert_eq!(
        ::std::mem::size_of::<max_align_t>(),
        32usize,
        concat!("Size of: ", stringify!(max_align_t))
    );
    assert_eq!(
        unsafe {
            &(*std::ptr::null::<max_align_t>()).__clang_max_align_nonce1 as *const _ as usize
        },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(max_align_t),
            "::",
            stringify!(__clang_max_align_nonce1)
        )
    );
    assert_eq!(
        unsafe {
            &(*std::ptr::null::<max_align_t>()).__clang_max_align_nonce2 as *const _ as usize
        },
        16usize,
        concat!(
            "Alignment of field: ",
            stringify!(max_align_t),
            "::",
            stringify!(__clang_max_align_nonce2)
        )
    );
}
pub const DLDeviceType_kDLCPU: DLDeviceType = 1;
pub const DLDeviceType_kDLCUDA: DLDeviceType = 2;
pub const DLDeviceType_kDLCUDAHost: DLDeviceType = 3;
pub const DLDeviceType_kDLOpenCL: DLDeviceType = 4;
pub const DLDeviceType_kDLVulkan: DLDeviceType = 7;
pub const DLDeviceType_kDLMetal: DLDeviceType = 8;
pub const DLDeviceType_kDLVPI: DLDeviceType = 9;
pub const DLDeviceType_kDLROCM: DLDeviceType = 10;
pub const DLDeviceType_kDLROCMHost: DLDeviceType = 11;
pub const DLDeviceType_kDLExtDev: DLDeviceType = 12;
pub const DLDeviceType_kDLCUDAManaged: DLDeviceType = 13;
pub const DLDeviceType_kDLOneAPI: DLDeviceType = 14;
pub const DLDeviceType_kDLWebGPU: DLDeviceType = 15;
pub const DLDeviceType_kDLHexagon: DLDeviceType = 16;
pub type DLDeviceType = ::std::os::raw::c_uint;
/// \brief A Device for Tensor and operator.
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct DLDevice {
    /// \brief The device type used in the device.
    pub device_type: DLDeviceType,
    /// \brief The device index.
    /// For vanilla CPU memory, pinned memory, or managed memory, this is set to 0.
    pub device_id: i32,
}
#[test]
fn bindgen_test_layout_DLDevice() {
    assert_eq!(
        ::std::mem::size_of::<DLDevice>(),
        8usize,
        concat!("Size of: ", stringify!(DLDevice))
    );
    assert_eq!(
        ::std::mem::align_of::<DLDevice>(),
        4usize,
        concat!("Alignment of ", stringify!(DLDevice))
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLDevice>()).device_type as *const _ as usize },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLDevice),
            "::",
            stringify!(device_type)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLDevice>()).device_id as *const _ as usize },
        4usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLDevice),
            "::",
            stringify!(device_id)
        )
    );
}
pub const DLDataTypeCode_kDLInt: DLDataTypeCode = 0;
pub const DLDataTypeCode_kDLUInt: DLDataTypeCode = 1;
pub const DLDataTypeCode_kDLFloat: DLDataTypeCode = 2;
pub const DLDataTypeCode_kDLOpaqueHandle: DLDataTypeCode = 3;
pub const DLDataTypeCode_kDLBfloat: DLDataTypeCode = 4;
pub const DLDataTypeCode_kDLComplex: DLDataTypeCode = 5;
pub type DLDataTypeCode = ::std::os::raw::c_uint;
/// \brief The data type the tensor can hold.
///
/// Examples
/// - float: type_code = 2, bits = 32, lanes=1
/// - float4(vectorized 4 float): type_code = 2, bits = 32, lanes=4
/// - int8: type_code = 0, bits = 8, lanes=1
/// - std::complex<float>: type_code = 5, bits = 64, lanes = 1
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct DLDataType {
    /// \brief Type code of base types.
    /// We keep it uint8_t instead of DLDataTypeCode for minimal memory
    /// footprint, but the value should be one of DLDataTypeCode enum values.
    ///
    pub code: u8,
    /// \brief Number of bits, common choices are 8, 16, 32.
    pub bits: u8,
    /// \brief Number of lanes in the type, used for vector types.
    pub lanes: u16,
}
#[test]
fn bindgen_test_layout_DLDataType() {
    assert_eq!(
        ::std::mem::size_of::<DLDataType>(),
        4usize,
        concat!("Size of: ", stringify!(DLDataType))
    );
    assert_eq!(
        ::std::mem::align_of::<DLDataType>(),
        2usize,
        concat!("Alignment of ", stringify!(DLDataType))
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLDataType>()).code as *const _ as usize },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLDataType),
            "::",
            stringify!(code)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLDataType>()).bits as *const _ as usize },
        1usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLDataType),
            "::",
            stringify!(bits)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLDataType>()).lanes as *const _ as usize },
        2usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLDataType),
            "::",
            stringify!(lanes)
        )
    );
}
/// \brief Plain C Tensor object, does not manage memory.
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct DLTensor {
    /// \brief The data pointer points to the allocated data. This will be CUDA
    /// device pointer or cl_mem handle in OpenCL. It may be opaque on some device
    /// types. This pointer is always aligned to 256 bytes as in CUDA. The
    /// `byte_offset` field should be used to point to the beginning of the data.
    ///
    /// Note that as of Nov 2021, multiply libraries (CuPy, PyTorch, TensorFlow,
    /// TVM, perhaps others) do not adhere to this 256 byte aligment requirement
    /// on CPU/CUDA/ROCm, and always use `byte_offset=0`.  This must be fixed
    /// (after which this note will be updated); at the moment it is recommended
    /// to not rely on the data pointer being correctly aligned.
    ///
    /// For given DLTensor, the size of memory required to store the contents of
    /// data is calculated as follows:
    ///
    /// \code{.c}
    /// static inline size_t GetDataSize(const DLTensor* t) {
    /// size_t size = 1;
    /// for (tvm_index_t i = 0; i < t->ndim; ++i) {
    /// size *= t->shape[i];
    /// }
    /// size *= (t->dtype.bits * t->dtype.lanes + 7) / 8;
    /// return size;
    /// }
    /// \endcode
    pub data: *mut ::std::os::raw::c_void,
    /// \brief The device of the tensor
    pub device: DLDevice,
    /// \brief Number of dimensions
    pub ndim: i32,
    /// \brief The data type of the pointer
    pub dtype: DLDataType,
    /// \brief The shape of the tensor
    pub shape: *mut i64,
    /// \brief strides of the tensor (in number of elements, not bytes)
    /// can be NULL, indicating tensor is compact and row-majored.
    pub strides: *mut i64,
    /// \brief The offset in bytes to the beginning pointer to data
    pub byte_offset: u64,
}
#[test]
fn bindgen_test_layout_DLTensor() {
    assert_eq!(
        ::std::mem::size_of::<DLTensor>(),
        48usize,
        concat!("Size of: ", stringify!(DLTensor))
    );
    assert_eq!(
        ::std::mem::align_of::<DLTensor>(),
        8usize,
        concat!("Alignment of ", stringify!(DLTensor))
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).data as *const _ as usize },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(data)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).device as *const _ as usize },
        8usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(device)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).ndim as *const _ as usize },
        16usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(ndim)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).dtype as *const _ as usize },
        20usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(dtype)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).shape as *const _ as usize },
        24usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(shape)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).strides as *const _ as usize },
        32usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(strides)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLTensor>()).byte_offset as *const _ as usize },
        40usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLTensor),
            "::",
            stringify!(byte_offset)
        )
    );
}
/// \brief C Tensor object, manage memory of DLTensor. This data structure is
/// intended to facilitate the borrowing of DLTensor by another framework. It is
/// not meant to transfer the tensor. When the borrowing framework doesn't need
/// the tensor, it should call the deleter to notify the host that the resource
/// is no longer needed.
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct DLManagedTensor {
    /// \brief DLTensor which is being memory managed
    pub dl_tensor: DLTensor,
    /// \brief the context of the original host framework of DLManagedTensor in
    /// which DLManagedTensor is used in the framework. It can also be NULL.
    pub manager_ctx: *mut ::std::os::raw::c_void,
    /// \brief Destructor signature void (*)(void*) - this should be called
    /// to destruct manager_ctx which holds the DLManagedTensor. It can be NULL
    /// if there is no way for the caller to provide a reasonable destructor.
    /// The destructors deletes the argument self as well.
    pub deleter: ::std::option::Option<unsafe extern "C" fn(self_: *mut DLManagedTensor)>,
}
#[test]
fn bindgen_test_layout_DLManagedTensor() {
    assert_eq!(
        ::std::mem::size_of::<DLManagedTensor>(),
        64usize,
        concat!("Size of: ", stringify!(DLManagedTensor))
    );
    assert_eq!(
        ::std::mem::align_of::<DLManagedTensor>(),
        8usize,
        concat!("Alignment of ", stringify!(DLManagedTensor))
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLManagedTensor>()).dl_tensor as *const _ as usize },
        0usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLManagedTensor),
            "::",
            stringify!(dl_tensor)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLManagedTensor>()).manager_ctx as *const _ as usize },
        48usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLManagedTensor),
            "::",
            stringify!(manager_ctx)
        )
    );
    assert_eq!(
        unsafe { &(*std::ptr::null::<DLManagedTensor>()).deleter as *const _ as usize },
        56usize,
        concat!(
            "Alignment of field: ",
            stringify!(DLManagedTensor),
            "::",
            stringify!(deleter)
        )
    );
}
