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

        type Span = crate::utils::ffi::Span;
        type PE_DataDirectory = crate::pe::data_directories::ffi::PE_DataDirectory;
        type PE_Section = crate::pe::section::ffi::PE_Section;

        type PE_TLS;

        fn data_template(self: &PE_TLS) -> Span;
        #[Self = "PE_TLS"]
        fn create() -> UniquePtr<PE_TLS>;
        fn callbacks(self: &PE_TLS) -> UniquePtr<CxxVector<u64>>;
        fn addressof_index(self: &PE_TLS) -> u64;
        fn addressof_callbacks(self: &PE_TLS) -> u64;
        fn sizeof_zero_fill(self: &PE_TLS) -> u32;
        fn characteristics(self: &PE_TLS) -> u32;
        fn addressof_raw_data(self: &PE_TLS) -> UniquePtr<CxxVector<u64>>;
        fn section(self: &PE_TLS) -> UniquePtr<PE_Section>;
        fn data_directory(self: &PE_TLS) -> UniquePtr<PE_DataDirectory>;
        fn add_callback(self: Pin<&mut PE_TLS>, addr: u64);
        fn set_characteristics(self: Pin<&mut PE_TLS>, value: u32);
        fn set_addressof_index(self: Pin<&mut PE_TLS>, value: u64);
        fn set_addressof_callback(self: Pin<&mut PE_TLS>, value: u64);
        fn set_sizeof_zero_fill(self: Pin<&mut PE_TLS>, value: u32);
        unsafe fn set_callbacks(self: Pin<&mut PE_TLS>, ptr: *const u64, size: usize);
        unsafe fn set_data_template(self: Pin<&mut PE_TLS>, ptr: *const u8, size: usize);
    }
    impl UniquePtr<PE_TLS> {}
}