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

        type PE_ExportEntry = crate::pe::export_entry::ffi::PE_ExportEntry;

        type PE_Export;

        #[Self = "PE_Export"]
        fn create() -> UniquePtr<PE_Export>;
        fn export_flags(self: &PE_Export) -> u32;
        fn timestamp(self: &PE_Export) -> u32;
        fn major_version(self: &PE_Export) -> u16;
        fn minor_version(self: &PE_Export) -> u16;
        fn ordinal_base(self: &PE_Export) -> u32;
        fn name_rva(self: &PE_Export) -> u32;
        fn export_addr_table_rva(self: &PE_Export) -> u32;
        fn export_addr_table_cnt(self: &PE_Export) -> u32;
        fn names_addr_table_rva(self: &PE_Export) -> u32;
        fn names_addr_table_cnt(self: &PE_Export) -> u32;
        fn ord_addr_table_rva(self: &PE_Export) -> u32;
        fn name(self: &PE_Export) -> UniquePtr<CxxString>;
        fn entries(self: &PE_Export) -> UniquePtr<PE_Export_it_entries>;
        fn set_name(self: Pin<&mut PE_Export>, name: &CxxString);
        fn entry_by_name(self: &PE_Export, name: &CxxString) -> UniquePtr<PE_ExportEntry>;
        fn add_entry(
            self: Pin<&mut PE_Export>,
            entry: &PE_ExportEntry,
        ) -> UniquePtr<PE_ExportEntry>;
        fn add_entry_by_name(
            self: Pin<&mut PE_Export>,
            name: &CxxString,
            rva: u32,
        ) -> UniquePtr<PE_ExportEntry>;
        fn remove_entry(self: Pin<&mut PE_Export>, entry: UniquePtr<PE_ExportEntry>) -> bool;
        fn remove_entry_by_name(self: Pin<&mut PE_Export>, name: &CxxString) -> bool;
        fn set_export_flags(self: Pin<&mut PE_Export>, flags: u32);
        fn set_timestamp(self: Pin<&mut PE_Export>, ts: u32);
        fn set_major_version(self: Pin<&mut PE_Export>, version: u32);
        fn set_minor_version(self: Pin<&mut PE_Export>, version: u32);
        fn entry_by_ordinal(self: &PE_Export, ord: u32) -> UniquePtr<PE_ExportEntry>;
        fn entry_at_rva(self: &PE_Export, rva: u32) -> UniquePtr<PE_ExportEntry>;
        fn remove_entry_at(self: Pin<&mut PE_Export>, rva: u32) -> bool;

        type PE_Export_it_entries;

        fn next(self: Pin<&mut PE_Export_it_entries>) -> UniquePtr<PE_ExportEntry>;
        fn size(self: &PE_Export_it_entries) -> u64;
    }
    impl UniquePtr<PE_Export> {}
    impl UniquePtr<PE_Export_it_entries> {}
}