xref: /aosp_15_r20/external/cronet/base/apple/owned_objc.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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