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

        type ObjC_Class = crate::objc::class::ffi::ObjC_Class;
        type ObjC_DeclOpt = crate::objc::decl_opt::ffi::ObjC_DeclOpt;
        type ObjC_Protocol = crate::objc::protocol::ffi::ObjC_Protocol;
        type ObjC_Category = crate::objc::category::ffi::ObjC_Category;

        type ObjC_Metadata;

        fn get_class(self: &ObjC_Metadata, name: &CxxString) -> UniquePtr<ObjC_Class>;
        fn get_protocol(self: &ObjC_Metadata, name: &CxxString) -> UniquePtr<ObjC_Protocol>;
        fn classes(self: &ObjC_Metadata) -> UniquePtr<ObjC_Metadata_it_classes>;
        fn protocols(self: &ObjC_Metadata) -> UniquePtr<ObjC_Metadata_it_protocols>;
        fn categories(self: &ObjC_Metadata) -> UniquePtr<ObjC_Metadata_it_categories>;
        fn to_decl(self: &ObjC_Metadata) -> UniquePtr<CxxString>;
        fn to_decl_with_opt(self: &ObjC_Metadata, opt: &ObjC_DeclOpt) -> UniquePtr<CxxString>;

        type ObjC_Metadata_it_classes;

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

        type ObjC_Metadata_it_protocols;

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

        type ObjC_Metadata_it_categories;

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

    impl UniquePtr<ObjC_Metadata> {}
    impl UniquePtr<ObjC_Metadata_it_classes> {}
    impl UniquePtr<ObjC_Metadata_it_protocols> {}
    impl UniquePtr<ObjC_Metadata_it_categories> {}
}