133d722a9Sopenharmony_ciuse crate::syntax::atom::Atom::{self, *}; 233d722a9Sopenharmony_ciuse crate::syntax::{derive, Trait, Type, Types}; 333d722a9Sopenharmony_ci 433d722a9Sopenharmony_ciimpl<'a> Types<'a> { 533d722a9Sopenharmony_ci pub fn is_guaranteed_pod(&self, ty: &Type) -> bool { 633d722a9Sopenharmony_ci match ty { 733d722a9Sopenharmony_ci Type::Ident(ident) => { 833d722a9Sopenharmony_ci let ident = &ident.rust; 933d722a9Sopenharmony_ci if let Some(atom) = Atom::from(ident) { 1033d722a9Sopenharmony_ci match atom { 1133d722a9Sopenharmony_ci Bool | Char | U8 | U16 | U32 | U64 | Usize | I8 | I16 | I32 | I64 1233d722a9Sopenharmony_ci | Isize | F32 | F64 => true, 1333d722a9Sopenharmony_ci CxxString | RustString => false, 1433d722a9Sopenharmony_ci } 1533d722a9Sopenharmony_ci } else if let Some(strct) = self.structs.get(ident) { 1633d722a9Sopenharmony_ci derive::contains(&strct.derives, Trait::Copy) 1733d722a9Sopenharmony_ci || strct 1833d722a9Sopenharmony_ci .fields 1933d722a9Sopenharmony_ci .iter() 2033d722a9Sopenharmony_ci .all(|field| self.is_guaranteed_pod(&field.ty)) 2133d722a9Sopenharmony_ci } else { 2233d722a9Sopenharmony_ci self.enums.contains_key(ident) 2333d722a9Sopenharmony_ci } 2433d722a9Sopenharmony_ci } 2533d722a9Sopenharmony_ci Type::RustBox(_) 2633d722a9Sopenharmony_ci | Type::RustVec(_) 2733d722a9Sopenharmony_ci | Type::UniquePtr(_) 2833d722a9Sopenharmony_ci | Type::SharedPtr(_) 2933d722a9Sopenharmony_ci | Type::WeakPtr(_) 3033d722a9Sopenharmony_ci | Type::CxxVector(_) 3133d722a9Sopenharmony_ci | Type::Void(_) => false, 3233d722a9Sopenharmony_ci Type::Ref(_) | Type::Str(_) | Type::Fn(_) | Type::SliceRef(_) | Type::Ptr(_) => true, 3333d722a9Sopenharmony_ci Type::Array(array) => self.is_guaranteed_pod(&array.inner), 3433d722a9Sopenharmony_ci } 3533d722a9Sopenharmony_ci } 3633d722a9Sopenharmony_ci} 37