/// An enum representing custom handling that can be given to a variant. #[derive(Copy, Clone, Debug, PartialEq, Eq)] pubenum EnumVariantCustomBehavior { /// This variant will be a module containing constants.
ModuleConstify, /// This variant will be constified, that is, forced to generate a constant.
Constify, /// This variant will be hidden entirely from the resulting enum.
Hide,
}
/// A C/C++ enumeration. #[derive(Debug)] pub(crate) structEnum { /// The representation used for this enum; it should be an `IntKind` type or /// an alias to one. /// /// It's `None` if the enum is a forward declaration and isn't defined /// anywhere else, see `tests/headers/func_ptr_in_struct.h`.
repr: Option<TypeId>,
/// The different variants, with explicit values.
variants: Vec<EnumVariant>,
}
implEnum { /// Construct a new `Enum` with the given representation and variants. pub(crate) fn new(
repr: Option<TypeId>,
variants: Vec<EnumVariant>,
) -> Self { Enum { repr, variants }
}
/// Get this enumeration's representation. pub(crate) fn repr(&self) -> Option<TypeId> { self.repr
}
/// Get this enumeration's variants. pub(crate) fn variants(&self) -> &[EnumVariant] {
&self.variants
}
/// Construct an enumeration from the given Clang type. pub(crate) fn from_ty(
ty: &clang::Type,
ctx: &mut BindgenContext,
) -> Result<Self, ParseError> { use clang_sys::*;
debug!("Enum::from_ty {:?}", ty);
if ty.kind() != CXType_Enum { return Err(ParseError::Continue);
}
let declaration = ty.declaration().canonical(); let repr = declaration
.enum_type()
.and_then(|et| Item::from_ty(&et, declaration, None, ctx).ok()); letmut variants = vec![];
let variant_ty =
repr.and_then(|r| ctx.resolve_type(r).safe_canonical_type(ctx)); let is_bool = variant_ty.map_or(false, Type::is_bool);
// Assume signedness since the default type by the C standard is an int. let is_signed = variant_ty.map_or(true, |ty| match *ty.kind() {
TypeKind::Int(ref int_kind) => int_kind.is_signed(), ref other => {
panic!("Since when enums can be non-integers? {:?}", other)
}
});
let type_name = ty.spelling(); let type_name = if type_name.is_empty() {
None
} else {
Some(type_name)
}; let type_name = type_name.as_deref();
let definition = declaration.definition().unwrap_or(declaration);
definition.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { let value = if is_bool {
cursor.enum_val_boolean().map(EnumVariantValue::Boolean)
} elseif is_signed {
cursor.enum_val_signed().map(EnumVariantValue::Signed)
} else {
cursor.enum_val_unsigned().map(EnumVariantValue::Unsigned)
}; iflet Some(val) = value { let name = cursor.spelling(); let annotations = Annotations::new(&cursor); let custom_behavior = ctx
.options()
.last_callback(|callbacks| {
callbacks
.enum_variant_behavior(type_name, &name, val)
})
.or_else(|| { let annotations = annotations.as_ref()?; if annotations.hide() {
Some(EnumVariantCustomBehavior::Hide)
} elseif annotations.constify_enum_variant() {
Some(EnumVariantCustomBehavior::Constify)
} else {
None
}
});
/// A single enum variant, to be contained only in an enum. #[derive(Debug)] pub(crate) struct EnumVariant { /// The name of the variant.
name: String,
/// The original name of the variant (without user mangling)
name_for_allowlisting: String,
/// An optional doc comment.
comment: Option<String>,
/// The integer value of the variant.
val: EnumVariantValue,
/// The custom behavior this variant may have, if any.
custom_behavior: Option<EnumVariantCustomBehavior>,
}
/// A constant value assigned to an enumeration variant. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pubenum EnumVariantValue { /// A boolean constant.
Boolean(bool),
/// A signed constant.
Signed(i64),
/// An unsigned constant.
Unsigned(u64),
}
impl EnumVariant { /// Construct a new enumeration variant from the given parts. pub(crate) fn new(
name: String,
name_for_allowlisting: String,
comment: Option<String>,
val: EnumVariantValue,
custom_behavior: Option<EnumVariantCustomBehavior>,
) -> Self {
EnumVariant {
name,
name_for_allowlisting,
comment,
val,
custom_behavior,
}
}
/// Get this variant's name. pub(crate) fn name(&self) -> &str {
&self.name
}
/// Get this variant's name. pub(crate) fn name_for_allowlisting(&self) -> &str {
&self.name_for_allowlisting
}
/// Get this variant's value. pub(crate) fn val(&self) -> EnumVariantValue { self.val
}
/// Get this variant's documentation. pub(crate) fn comment(&self) -> Option<&str> { self.comment.as_deref()
}
/// Returns whether this variant should be enforced to be a constant by code /// generation. pub(crate) fn force_constification(&self) -> bool { self.custom_behavior
.map_or(false, |b| b == EnumVariantCustomBehavior::Constify)
}
/// Returns whether the current variant should be hidden completely from the /// resulting rust enum. pub(crate) fn hidden(&self) -> bool { self.custom_behavior
.map_or(false, |b| b == EnumVariantCustomBehavior::Hide)
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.