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