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

        type AbstracDebugInfo = crate::generic::debug_info::ffi::AbstracDebugInfo;
        type DWARF_CompilationUnit = crate::dwarf::compilation_unit::ffi::DWARF_CompilationUnit;
        type DWARF_Function = crate::dwarf::function::ffi::DWARF_Function;
        type DWARF_Type = crate::dwarf::type_::ffi::DWARF_Type;
        type DWARF_Variable = crate::dwarf::variable::ffi::DWARF_Variable;

        type DWARF_DebugInfo;

        #[Self = "DWARF_DebugInfo"]
        fn from_file(file: &CxxString) -> UniquePtr<DWARF_DebugInfo>;
        #[Self = "DWARF_DebugInfo"]
        fn classof(reloc: &AbstracDebugInfo) -> bool;
        fn compilation_units(
            self: &DWARF_DebugInfo,
        ) -> UniquePtr<DWARF_DebugInfo_it_compilation_units>;
        fn function_by_name(self: &DWARF_DebugInfo, name: &CxxString) -> UniquePtr<DWARF_Function>;
        fn variable_by_name(self: &DWARF_DebugInfo, name: &CxxString) -> UniquePtr<DWARF_Variable>;
        fn type_by_name(self: &DWARF_DebugInfo, name: &CxxString) -> UniquePtr<DWARF_Type>;
        fn function_by_addr(self: &DWARF_DebugInfo, addr: u64) -> UniquePtr<DWARF_Function>;
        fn variable_by_addr(self: &DWARF_DebugInfo, addr: u64) -> UniquePtr<DWARF_Variable>;

        type DWARF_DebugInfo_it_compilation_units;

        fn next(
            self: Pin<&mut DWARF_DebugInfo_it_compilation_units>,
        ) -> UniquePtr<DWARF_CompilationUnit>;
        fn size(self: &DWARF_DebugInfo_it_compilation_units) -> u64;
    }
    impl UniquePtr<DWARF_DebugInfo> {}
    impl UniquePtr<DWARF_DebugInfo_it_compilation_units> {}
}