blob: 0fc8debffafff4961846c7a1df22ee20e45a1603 [file] [log] [blame]
//! Traits for determining whether we can derive traits for a thing or not.
use super::context::BindgenContext;
/// A trait that encapsulates the logic for whether or not we can derive `Debug`
/// for a given thing.
///
/// This should ideally be a no-op that just returns `true`, but instead needs
/// to be a recursive method that checks whether all the proper members can
/// derive debug or not, because of the limit rust has on 32 items as max in the
/// array.
pub trait CanDeriveDebug {
/// Implementations can define this type to get access to any extra
/// information required to determine whether they can derive `Debug`. If
/// extra information is unneeded, then this should simply be the unit type.
type Extra;
/// Return `true` if `Debug` can be derived for this thing, `false`
/// otherwise.
fn can_derive_debug(&self,
ctx: &BindgenContext,
extra: Self::Extra)
-> bool;
}
/// A trait that encapsulates the logic for whether or not we can derive `Copy`
/// for a given thing.
pub trait CanDeriveCopy<'a> {
/// Implementations can define this type to get access to any extra
/// information required to determine whether they can derive `Copy`. If
/// extra information is unneeded, then this should simply be the unit type.
type Extra;
/// Return `true` if `Copy` can be derived for this thing, `false`
/// otherwise.
fn can_derive_copy(&'a self,
ctx: &'a BindgenContext,
extra: Self::Extra)
-> bool;
/// For some reason, deriving copies of an array of a type that is not known
/// to be `Copy` is a compile error. e.g.:
///
/// ```rust
/// #[derive(Copy, Clone)]
/// struct A<T> {
/// member: T,
/// }
/// ```
///
/// is fine, while:
///
/// ```rust,ignore
/// #[derive(Copy, Clone)]
/// struct A<T> {
/// member: [T; 1],
/// }
/// ```
///
/// is an error.
///
/// That's the whole point of the existence of `can_derive_copy_in_array`.
fn can_derive_copy_in_array(&'a self,
ctx: &'a BindgenContext,
extra: Self::Extra)
-> bool;
}
/// A trait that encapsulates the logic for whether or not we can derive `Default`
/// for a given thing.
///
/// This should ideally be a no-op that just returns `true`, but instead needs
/// to be a recursive method that checks whether all the proper members can
/// derive default or not, because of the limit rust has on 32 items as max in the
/// array.
pub trait CanDeriveDefault {
/// Implementations can define this type to get access to any extra
/// information required to determine whether they can derive `Default`. If
/// extra information is unneeded, then this should simply be the unit type.
type Extra;
/// Return `true` if `Default` can be derived for this thing, `false`
/// otherwise.
fn can_derive_default(&self,
ctx: &BindgenContext,
extra: Self::Extra)
-> bool;
}