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

        type Span = crate::utils::ffi::Span;
        type ELF_Segment;

        fn content(self: &ELF_Segment) -> Span;
        #[Self = "ELF_Segment"]
        fn create() -> UniquePtr<ELF_Segment>;
        fn flags(self: &ELF_Segment) -> u32;
        fn file_offset(self: &ELF_Segment) -> u64;
        fn virtual_address(self: &ELF_Segment) -> u64;
        fn physical_address(self: &ELF_Segment) -> u64;
        fn physical_size(self: &ELF_Segment) -> u64;
        fn virtual_size(self: &ELF_Segment) -> u64;
        fn alignment(self: &ELF_Segment) -> u64;
        fn set_type(self: Pin<&mut ELF_Segment>, ty: u64);
        fn fill(self: Pin<&mut ELF_Segment>, c: i8);
        fn clear(self: Pin<&mut ELF_Segment>);
        fn to_string(self: &ELF_Segment) -> UniquePtr<CxxString>;
        fn stype(self: &ELF_Segment) -> u64;
        fn set_flags(self: Pin<&mut ELF_Segment>, value: u32);
        fn set_file_offset(self: Pin<&mut ELF_Segment>, value: u64);
        fn set_virtual_address(self: Pin<&mut ELF_Segment>, value: u64);
        fn set_physical_address(self: Pin<&mut ELF_Segment>, value: u64);
        fn set_virtual_size(self: Pin<&mut ELF_Segment>, value: u64);
        fn set_alignment(self: Pin<&mut ELF_Segment>, value: u64);
        unsafe fn set_content(self: Pin<&mut ELF_Segment>, ptr: *const u8, size: u64);
    }
    impl UniquePtr<ELF_Segment> {}
}