|  | // Copyright 2023 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_APPLE_OWNED_OBJC_H_ | 
|  | #define BASE_APPLE_OWNED_OBJC_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | // This file defines wrappers to allow C++ code to hold references to | 
|  | // Objective-C objects (either strong or weak) without being Objective-C++ code | 
|  | // themselves. | 
|  | // | 
|  | // WHEN NOT TO USE: | 
|  | // - Do not use these for pure Objective-C++ code. For that code, simply use | 
|  | //   Objective-C types as normal. | 
|  | // - Do not use as a member variable in an Objective-C++ class where the header | 
|  | //   is included from C++ files. Use the pimpl idiom instead: | 
|  | //   https://chromium.googlesource.com/chromium/src/+/main/docs/mac/mixing_cpp_and_objc.md | 
|  | // | 
|  | // Use these wrappers only in the situation where C++ code is passing | 
|  | // Objective-C framework objects around, instead of using double-declaration. | 
|  |  | 
|  | #if __OBJC__ | 
|  |  | 
|  | #define GENERATE_STRONG_OBJC_TYPE(name) @class name; | 
|  | #define GENERATE_STRONG_OBJC_PROTOCOL(name) @protocol name; | 
|  | #define GENERATE_WEAK_OBJC_TYPE(name) @class name; | 
|  | #define GENERATE_WEAK_OBJC_PROTOCOL(name) @protocol name; | 
|  |  | 
|  | #include "base/apple/owned_objc_types.h" | 
|  |  | 
|  | #undef GENERATE_STRONG_OBJC_TYPE | 
|  | #undef GENERATE_STRONG_OBJC_PROTOCOL | 
|  | #undef GENERATE_WEAK_OBJC_TYPE | 
|  | #undef GENERATE_WEAK_OBJC_PROTOCOL | 
|  |  | 
|  | #endif  // __OBJC__ | 
|  |  | 
|  | // Define this class two ways: the full-fledged way that allows Objective-C code | 
|  | // to fully construct and access the inner Objective-C object, and a | 
|  | // C++-compatible way that does not expose any Objective-C code and only allows | 
|  | // default construction and validity checking. | 
|  | #if __OBJC__ | 
|  | #define OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype) \ | 
|  | explicit classname(objctype obj);                         \ | 
|  | objctype Get() const; | 
|  | #else | 
|  | #define OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype) | 
|  | #endif  // __OBJC__ | 
|  |  | 
|  | #define OWNED_OBJC_DECL(classname, objctype)                 \ | 
|  | namespace base::apple {                                    \ | 
|  | class BASE_EXPORT classname {                              \ | 
|  | public:                                                   \ | 
|  | /* Default-construct in a null state. */                 \ | 
|  | classname();                                             \ | 
|  | ~classname();                                            \ | 
|  | classname(const classname&);                             \ | 
|  | classname& operator=(const classname&);                  \ | 
|  | /* Returns whether the object contains a valid object.*/ \ | 
|  | explicit operator bool() const;                          \ | 
|  | /* Comparisons. */                                       \ | 
|  | bool operator==(const classname& other) const;           \ | 
|  | bool operator!=(const classname& other) const;           \ | 
|  | /* Objective-C-only constructor and getter. */           \ | 
|  | OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype)      \ | 
|  | \ | 
|  | private:                                                  \ | 
|  | struct ObjCStorage;                                      \ | 
|  | std::unique_ptr<ObjCStorage> objc_storage_;              \ | 
|  | };                                                         \ | 
|  | }  // namespace base::apple | 
|  |  | 
|  | #define GENERATE_STRONG_OBJC_TYPE(name) OWNED_OBJC_DECL(Owned##name, name*) | 
|  | #define GENERATE_STRONG_OBJC_PROTOCOL(name) \ | 
|  | OWNED_OBJC_DECL(Owned##name, id<name>) | 
|  | #define GENERATE_WEAK_OBJC_TYPE(name) OWNED_OBJC_DECL(Weak##name, name*) | 
|  | #define GENERATE_WEAK_OBJC_PROTOCOL(name) OWNED_OBJC_DECL(Weak##name, id<name>) | 
|  |  | 
|  | #include "base/apple/owned_objc_types.h" | 
|  |  | 
|  | #undef GENERATE_STRONG_OBJC_TYPE | 
|  | #undef GENERATE_STRONG_OBJC_PROTOCOL | 
|  | #undef GENERATE_WEAK_OBJC_TYPE | 
|  | #undef GENERATE_WEAK_OBJC_PROTOCOL | 
|  | #undef OWNED_OBJC_DECL | 
|  | #undef OWNED_TYPE_DECL_OBJC_ADDITIONS | 
|  |  | 
|  | #endif  // BASE_APPLE_OWNED_OBJC_H_ |