1 use crate::syntax::atom::Atom::{self, *}; 2 use crate::syntax::{derive, Trait, Type, Types}; 3 4 impl<'a> Types<'a> { is_guaranteed_pod(&self, ty: &Type) -> bool5 pub fn is_guaranteed_pod(&self, ty: &Type) -> bool { 6 match ty { 7 Type::Ident(ident) => { 8 let ident = &ident.rust; 9 if let Some(atom) = Atom::from(ident) { 10 match atom { 11 Bool | Char | U8 | U16 | U32 | U64 | Usize | I8 | I16 | I32 | I64 12 | Isize | F32 | F64 => true, 13 CxxString | RustString => false, 14 } 15 } else if let Some(strct) = self.structs.get(ident) { 16 derive::contains(&strct.derives, Trait::Copy) 17 || strct 18 .fields 19 .iter() 20 .all(|field| self.is_guaranteed_pod(&field.ty)) 21 } else { 22 self.enums.contains_key(ident) 23 } 24 } 25 Type::RustBox(_) 26 | Type::RustVec(_) 27 | Type::UniquePtr(_) 28 | Type::SharedPtr(_) 29 | Type::WeakPtr(_) 30 | Type::CxxVector(_) 31 | Type::Void(_) => false, 32 Type::Ref(_) | Type::Str(_) | Type::Fn(_) | Type::SliceRef(_) | Type::Ptr(_) => true, 33 Type::Array(array) => self.is_guaranteed_pod(&array.inner), 34 } 35 } 36 } 37