// SPDX-License-Identifier: GPL-2.0-or-later

use std::ptr;

/// Encapsulates the requirement that
/// `MaybeUninit::<Self>::zeroed().assume_init()` does not cause undefined
/// behavior.  This trait in principle could be implemented as just:
///
/// ```
/// pub unsafe trait Zeroable: Default {
///     const ZERO: Self = unsafe { ::core::mem::MaybeUninit::<Self>::zeroed().assume_init() };
/// }
/// ```
///
/// The need for a manual implementation is only because `zeroed()` cannot
/// be used as a `const fn` prior to Rust 1.75.0. Once we can assume a new
/// enough version of the compiler, we could provide a `#[derive(Zeroable)]`
/// macro to check at compile-time that all struct fields are Zeroable, and
/// use the above blanket implementation of the `ZERO` constant.
///
/// # Safety
///
/// Because the implementation of `ZERO` is manual, it does not make
/// any assumption on the safety of `zeroed()`.  However, other users of the
/// trait could use it that way.  Do not add this trait to a type unless
/// all-zeroes is a valid value for the type.  In particular, remember that
/// raw pointers can be zero, but references and `NonNull<T>` cannot
pub unsafe trait Zeroable: Default {
    const ZERO: Self;
}

unsafe impl Zeroable for crate::bindings::Property__bindgen_ty_1 {
    const ZERO: Self = Self { i: 0 };
}

unsafe impl Zeroable for crate::bindings::Property {
    const ZERO: Self = Self {
        name: ptr::null(),
        info: ptr::null(),
        offset: 0,
        bitnr: 0,
        bitmask: 0,
        set_default: false,
        defval: Zeroable::ZERO,
        arrayoffset: 0,
        arrayinfo: ptr::null(),
        arrayfieldsize: 0,
        link_type: ptr::null(),
    };
}

unsafe impl Zeroable for crate::bindings::VMStateDescription {
    const ZERO: Self = Self {
        name: ptr::null(),
        unmigratable: false,
        early_setup: false,
        version_id: 0,
        minimum_version_id: 0,
        priority: crate::bindings::MigrationPriority::MIG_PRI_DEFAULT,
        pre_load: None,
        post_load: None,
        pre_save: None,
        post_save: None,
        needed: None,
        dev_unplug_pending: None,
        fields: ptr::null(),
        subsections: ptr::null(),
    };
}

unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_1 {
    const ZERO: Self = Self {
        min_access_size: 0,
        max_access_size: 0,
        unaligned: false,
        accepts: None,
    };
}

unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_2 {
    const ZERO: Self = Self {
        min_access_size: 0,
        max_access_size: 0,
        unaligned: false,
    };
}
