You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.4 KiB
37 lines
1.4 KiB
use crate::syntax::atom::Atom::{self, *};
|
|
use crate::syntax::{derive, Trait, Type, Types};
|
|
|
|
impl<'a> Types<'a> {
|
|
pub fn is_guaranteed_pod(&self, ty: &Type) -> bool {
|
|
match ty {
|
|
Type::Ident(ident) => {
|
|
let ident = &ident.rust;
|
|
if let Some(atom) = Atom::from(ident) {
|
|
match atom {
|
|
Bool | Char | U8 | U16 | U32 | U64 | Usize | I8 | I16 | I32 | I64
|
|
| Isize | F32 | F64 => true,
|
|
CxxString | RustString => false,
|
|
}
|
|
} else if let Some(strct) = self.structs.get(ident) {
|
|
derive::contains(&strct.derives, Trait::Copy)
|
|
|| strct
|
|
.fields
|
|
.iter()
|
|
.all(|field| self.is_guaranteed_pod(&field.ty))
|
|
} else {
|
|
self.enums.contains_key(ident)
|
|
}
|
|
}
|
|
Type::RustBox(_)
|
|
| Type::RustVec(_)
|
|
| Type::UniquePtr(_)
|
|
| Type::SharedPtr(_)
|
|
| Type::WeakPtr(_)
|
|
| Type::CxxVector(_)
|
|
| Type::Void(_) => false,
|
|
Type::Ref(_) | Type::Str(_) | Type::Fn(_) | Type::SliceRef(_) | Type::Ptr(_) => true,
|
|
Type::Array(array) => self.is_guaranteed_pod(&array.inner),
|
|
}
|
|
}
|
|
}
|