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

        type ELF_Note = crate::elf::note::ffi::ELF_Note;

        type ELF_NoteGnuProperty;

        #[Self = "ELF_NoteGnuProperty"]
        fn classof(note: &ELF_Note) -> bool;
        fn properties(self: &ELF_NoteGnuProperty) -> UniquePtr<ELF_NoteGnuProperty_it_properties>;
        fn find(self: &ELF_NoteGnuProperty, type_: u32) -> UniquePtr<ELF_NoteGnuProperty_Property>;

        type ELF_NoteGnuProperty_AArch64Feature;

        #[Self = "ELF_NoteGnuProperty_AArch64Feature"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn features(self: &ELF_NoteGnuProperty_AArch64Feature) -> UniquePtr<CxxVector<u64>>;

        type ELF_NoteGnuProperty_AArch64PAuth;

        #[Self = "ELF_NoteGnuProperty_AArch64PAuth"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn platform(self: &ELF_NoteGnuProperty_AArch64PAuth) -> u64;
        fn version(self: &ELF_NoteGnuProperty_AArch64PAuth) -> u64;

        type ELF_NoteGnuProperty_Generic;

        #[Self = "ELF_NoteGnuProperty_Generic"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn raw_type(self: &ELF_NoteGnuProperty_Generic) -> u32;

        type ELF_NoteGnuProperty_Needed;

        #[Self = "ELF_NoteGnuProperty_Needed"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn needs(self: &ELF_NoteGnuProperty_Needed) -> UniquePtr<CxxVector<u64>>;

        type ELF_NoteGnuProperty_NoteNoCopyOnProtected;

        #[Self = "ELF_NoteGnuProperty_NoteNoCopyOnProtected"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;

        type ELF_NoteGnuProperty_Property;

        fn get_type(self: &ELF_NoteGnuProperty_Property) -> u32;

        type ELF_NoteGnuProperty_StackSize;

        #[Self = "ELF_NoteGnuProperty_StackSize"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn stack_size(self: &ELF_NoteGnuProperty_StackSize) -> u64;

        type ELF_NoteGnuProperty_X86Features;

        #[Self = "ELF_NoteGnuProperty_X86Features"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn features(self: &ELF_NoteGnuProperty_X86Features) -> UniquePtr<CxxVector<u64>>;

        type ELF_NoteGnuProperty_X86ISA;

        #[Self = "ELF_NoteGnuProperty_X86ISA"]
        fn classof(prop: &ELF_NoteGnuProperty_Property) -> bool;
        fn values(self: &ELF_NoteGnuProperty_X86ISA) -> UniquePtr<CxxVector<u64>>;

        type ELF_NoteGnuProperty_it_properties;

        fn next(
            self: Pin<&mut ELF_NoteGnuProperty_it_properties>,
        ) -> UniquePtr<ELF_NoteGnuProperty_Property>;
        fn size(self: &ELF_NoteGnuProperty_it_properties) -> u64;
    }
    impl UniquePtr<ELF_NoteGnuProperty> {}
    impl UniquePtr<ELF_NoteGnuProperty_AArch64Feature> {}
    impl UniquePtr<ELF_NoteGnuProperty_AArch64PAuth> {}
    impl UniquePtr<ELF_NoteGnuProperty_Generic> {}
    impl UniquePtr<ELF_NoteGnuProperty_it_properties> {}
    impl UniquePtr<ELF_NoteGnuProperty_Needed> {}
    impl UniquePtr<ELF_NoteGnuProperty_NoteNoCopyOnProtected> {}
    impl UniquePtr<ELF_NoteGnuProperty_Property> {}
    impl UniquePtr<ELF_NoteGnuProperty_StackSize> {}
    impl UniquePtr<ELF_NoteGnuProperty_X86Features> {}
    impl UniquePtr<ELF_NoteGnuProperty_X86ISA> {}
}