#[cxx::bridge]
pub mod ffi {
    unsafe extern "C++" {
        include!("LIEF/rust/PDB/CompilationUnit.hpp");

        type PDB_BuildMetadata = crate::pdb::build_metadata::ffi::PDB_BuildMetadata;
        type PDB_Function = crate::pdb::function::ffi::PDB_Function;
        type LIEF_DeclOpt = crate::debug_decl_opt::ffi::LIEF_DeclOpt;

        type PDB_CompilationUnit;

        fn module_name(self: &PDB_CompilationUnit) -> UniquePtr<CxxString>;
        fn object_filename(self: &PDB_CompilationUnit) -> UniquePtr<CxxString>;
        fn sources(self: &PDB_CompilationUnit) -> UniquePtr<PDB_CompilationUnit_it_sources>;
        fn functions(self: &PDB_CompilationUnit) -> UniquePtr<PDB_CompilationUnit_it_functions>;
        fn build_metadata(self: &PDB_CompilationUnit) -> UniquePtr<PDB_BuildMetadata>;
        fn to_string(self: &PDB_CompilationUnit) -> UniquePtr<CxxString>;
        fn to_decl(self: &PDB_CompilationUnit) -> UniquePtr<CxxString>;
        fn to_decl_with_opt(self: &PDB_CompilationUnit, opt: &LIEF_DeclOpt)
        -> UniquePtr<CxxString>;

        type PDB_CompilationUnit_it_functions;

        fn next(self: Pin<&mut PDB_CompilationUnit_it_functions>) -> UniquePtr<PDB_Function>;
        fn size(self: &PDB_CompilationUnit_it_functions) -> u64;

        type PDB_CompilationUnit_it_sources;

        fn next(self: Pin<&mut PDB_CompilationUnit_it_sources>) -> UniquePtr<CxxString>;
        fn size(self: &PDB_CompilationUnit_it_sources) -> u64;
    }

    impl UniquePtr<PDB_CompilationUnit> {}
    impl UniquePtr<PDB_CompilationUnit_it_functions> {}
    impl UniquePtr<PDB_CompilationUnit_it_sources> {}
}