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

        type ObjC_DeclOpt = crate::objc::decl_opt::ffi::ObjC_DeclOpt;
        type ObjC_Method = crate::objc::method::ffi::ObjC_Method;
        type ObjC_Property = crate::objc::property::ffi::ObjC_Property;

        type ObjC_Protocol;

        fn mangled_name(self: &ObjC_Protocol) -> UniquePtr<CxxString>;
        fn protocols(self: &ObjC_Protocol) -> UniquePtr<ObjC_Protocol_it_protocols>;
        fn optional_methods(self: &ObjC_Protocol) -> UniquePtr<ObjC_Protocol_it_opt_methods>;
        fn required_methods(self: &ObjC_Protocol) -> UniquePtr<ObjC_Protocol_it_req_methods>;
        fn properties(self: &ObjC_Protocol) -> UniquePtr<ObjC_Protocol_it_properties>;
        fn to_decl(self: &ObjC_Protocol) -> UniquePtr<CxxString>;
        fn to_decl_with_opt(self: &ObjC_Protocol, opt: &ObjC_DeclOpt) -> UniquePtr<CxxString>;

        type ObjC_Protocol_it_protocols;

        fn next(self: Pin<&mut ObjC_Protocol_it_protocols>) -> UniquePtr<ObjC_Protocol>;
        fn size(self: &ObjC_Protocol_it_protocols) -> u64;

        type ObjC_Protocol_it_opt_methods;

        fn next(self: Pin<&mut ObjC_Protocol_it_opt_methods>) -> UniquePtr<ObjC_Method>;
        fn size(self: &ObjC_Protocol_it_opt_methods) -> u64;

        type ObjC_Protocol_it_properties;

        fn next(self: Pin<&mut ObjC_Protocol_it_properties>) -> UniquePtr<ObjC_Property>;
        fn size(self: &ObjC_Protocol_it_properties) -> u64;

        type ObjC_Protocol_it_req_methods;

        fn next(self: Pin<&mut ObjC_Protocol_it_req_methods>) -> UniquePtr<ObjC_Method>;
        fn size(self: &ObjC_Protocol_it_req_methods) -> u64;
    }

    impl UniquePtr<ObjC_Protocol> {}
    impl UniquePtr<ObjC_Protocol_it_protocols> {}
    impl UniquePtr<ObjC_Protocol_it_opt_methods> {}
    impl UniquePtr<ObjC_Protocol_it_properties> {}
    impl UniquePtr<ObjC_Protocol_it_req_methods> {}
}