1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_APPLE_OWNED_OBJC_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_APPLE_OWNED_OBJC_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker // This file defines wrappers to allow C++ code to hold references to 14*6777b538SAndroid Build Coastguard Worker // Objective-C objects (either strong or weak) without being Objective-C++ code 15*6777b538SAndroid Build Coastguard Worker // themselves. 16*6777b538SAndroid Build Coastguard Worker // 17*6777b538SAndroid Build Coastguard Worker // WHEN NOT TO USE: 18*6777b538SAndroid Build Coastguard Worker // - Do not use these for pure Objective-C++ code. For that code, simply use 19*6777b538SAndroid Build Coastguard Worker // Objective-C types as normal. 20*6777b538SAndroid Build Coastguard Worker // - Do not use as a member variable in an Objective-C++ class where the header 21*6777b538SAndroid Build Coastguard Worker // is included from C++ files. Use the pimpl idiom instead: 22*6777b538SAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromium/src/+/main/docs/mac/mixing_cpp_and_objc.md 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Use these wrappers only in the situation where C++ code is passing 25*6777b538SAndroid Build Coastguard Worker // Objective-C framework objects around, instead of using double-declaration. 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker #if __OBJC__ 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker #define GENERATE_STRONG_OBJC_TYPE(name) @class name; 30*6777b538SAndroid Build Coastguard Worker #define GENERATE_STRONG_OBJC_PROTOCOL(name) @protocol name; 31*6777b538SAndroid Build Coastguard Worker #define GENERATE_WEAK_OBJC_TYPE(name) @class name; 32*6777b538SAndroid Build Coastguard Worker #define GENERATE_WEAK_OBJC_PROTOCOL(name) @protocol name; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker #include "base/apple/owned_objc_types.h" 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker #undef GENERATE_STRONG_OBJC_TYPE 37*6777b538SAndroid Build Coastguard Worker #undef GENERATE_STRONG_OBJC_PROTOCOL 38*6777b538SAndroid Build Coastguard Worker #undef GENERATE_WEAK_OBJC_TYPE 39*6777b538SAndroid Build Coastguard Worker #undef GENERATE_WEAK_OBJC_PROTOCOL 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker #endif // __OBJC__ 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Define this class two ways: the full-fledged way that allows Objective-C code 44*6777b538SAndroid Build Coastguard Worker // to fully construct and access the inner Objective-C object, and a 45*6777b538SAndroid Build Coastguard Worker // C++-compatible way that does not expose any Objective-C code and only allows 46*6777b538SAndroid Build Coastguard Worker // default construction and validity checking. 47*6777b538SAndroid Build Coastguard Worker #if __OBJC__ 48*6777b538SAndroid Build Coastguard Worker #define OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype) \ 49*6777b538SAndroid Build Coastguard Worker explicit classname(objctype obj); \ 50*6777b538SAndroid Build Coastguard Worker objctype Get() const; 51*6777b538SAndroid Build Coastguard Worker #else 52*6777b538SAndroid Build Coastguard Worker #define OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype) 53*6777b538SAndroid Build Coastguard Worker #endif // __OBJC__ 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker #define OWNED_OBJC_DECL(classname, objctype) \ 56*6777b538SAndroid Build Coastguard Worker namespace base::apple { \ 57*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT classname { \ 58*6777b538SAndroid Build Coastguard Worker public: \ 59*6777b538SAndroid Build Coastguard Worker /* Default-construct in a null state. */ \ 60*6777b538SAndroid Build Coastguard Worker classname(); \ 61*6777b538SAndroid Build Coastguard Worker ~classname(); \ 62*6777b538SAndroid Build Coastguard Worker classname(const classname&); \ 63*6777b538SAndroid Build Coastguard Worker classname& operator=(const classname&); \ 64*6777b538SAndroid Build Coastguard Worker /* Returns whether the object contains a valid object.*/ \ 65*6777b538SAndroid Build Coastguard Worker explicit operator bool() const; \ 66*6777b538SAndroid Build Coastguard Worker /* Comparisons. */ \ 67*6777b538SAndroid Build Coastguard Worker bool operator==(const classname& other) const; \ 68*6777b538SAndroid Build Coastguard Worker bool operator!=(const classname& other) const; \ 69*6777b538SAndroid Build Coastguard Worker /* Objective-C-only constructor and getter. */ \ 70*6777b538SAndroid Build Coastguard Worker OWNED_TYPE_DECL_OBJC_ADDITIONS(classname, objctype) \ 71*6777b538SAndroid Build Coastguard Worker \ 72*6777b538SAndroid Build Coastguard Worker private: \ 73*6777b538SAndroid Build Coastguard Worker struct ObjCStorage; \ 74*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ObjCStorage> objc_storage_; \ 75*6777b538SAndroid Build Coastguard Worker }; \ 76*6777b538SAndroid Build Coastguard Worker } // namespace base::apple 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker #define GENERATE_STRONG_OBJC_TYPE(name) OWNED_OBJC_DECL(Owned##name, name*) 79*6777b538SAndroid Build Coastguard Worker #define GENERATE_STRONG_OBJC_PROTOCOL(name) \ 80*6777b538SAndroid Build Coastguard Worker OWNED_OBJC_DECL(Owned##name, id<name>) 81*6777b538SAndroid Build Coastguard Worker #define GENERATE_WEAK_OBJC_TYPE(name) OWNED_OBJC_DECL(Weak##name, name*) 82*6777b538SAndroid Build Coastguard Worker #define GENERATE_WEAK_OBJC_PROTOCOL(name) OWNED_OBJC_DECL(Weak##name, id<name>) 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker #include "base/apple/owned_objc_types.h" 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker #undef GENERATE_STRONG_OBJC_TYPE 87*6777b538SAndroid Build Coastguard Worker #undef GENERATE_STRONG_OBJC_PROTOCOL 88*6777b538SAndroid Build Coastguard Worker #undef GENERATE_WEAK_OBJC_TYPE 89*6777b538SAndroid Build Coastguard Worker #undef GENERATE_WEAK_OBJC_PROTOCOL 90*6777b538SAndroid Build Coastguard Worker #undef OWNED_OBJC_DECL 91*6777b538SAndroid Build Coastguard Worker #undef OWNED_TYPE_DECL_OBJC_ADDITIONS 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker #endif // BASE_APPLE_OWNED_OBJC_H_ 94