xref: /aosp_15_r20/external/cronet/base/apple/owned_objc.mm (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#include "base/apple/owned_objc.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker#include <MacTypes.h>  // For nil, to avoid having to bring in frameworks.
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker#include "build/build_config.h"
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker#define OWNED_OBJC_IMPL(classname, objctype, ownership)                      \
12*6777b538SAndroid Build Coastguard Worker  namespace base::apple {                                                    \
13*6777b538SAndroid Build Coastguard Worker  struct classname::ObjCStorage {                                            \
14*6777b538SAndroid Build Coastguard Worker    objctype ownership obj;                                                  \
15*6777b538SAndroid Build Coastguard Worker  };                                                                         \
16*6777b538SAndroid Build Coastguard Worker  classname::classname() : objc_storage_(std::make_unique<ObjCStorage>()) {} \
17*6777b538SAndroid Build Coastguard Worker  classname::~classname() = default;                                         \
18*6777b538SAndroid Build Coastguard Worker  classname::classname(objctype obj) : classname() {                         \
19*6777b538SAndroid Build Coastguard Worker    objc_storage_->obj = obj;                                                \
20*6777b538SAndroid Build Coastguard Worker  }                                                                          \
21*6777b538SAndroid Build Coastguard Worker  classname::classname(const classname& other) : classname() {               \
22*6777b538SAndroid Build Coastguard Worker    objc_storage_->obj = other.objc_storage_->obj;                           \
23*6777b538SAndroid Build Coastguard Worker  }                                                                          \
24*6777b538SAndroid Build Coastguard Worker  classname& classname::operator=(const classname& other) {                  \
25*6777b538SAndroid Build Coastguard Worker    objc_storage_->obj = other.objc_storage_->obj;                           \
26*6777b538SAndroid Build Coastguard Worker    return *this;                                                            \
27*6777b538SAndroid Build Coastguard Worker  }                                                                          \
28*6777b538SAndroid Build Coastguard Worker  classname::operator bool() const {                                         \
29*6777b538SAndroid Build Coastguard Worker    return objc_storage_->obj != nil;                                        \
30*6777b538SAndroid Build Coastguard Worker  }                                                                          \
31*6777b538SAndroid Build Coastguard Worker  bool classname::operator==(const classname& other) const {                 \
32*6777b538SAndroid Build Coastguard Worker    return objc_storage_->obj == other.objc_storage_->obj;                   \
33*6777b538SAndroid Build Coastguard Worker  }                                                                          \
34*6777b538SAndroid Build Coastguard Worker  bool classname::operator!=(const classname& other) const {                 \
35*6777b538SAndroid Build Coastguard Worker    return !this->operator==(other);                                         \
36*6777b538SAndroid Build Coastguard Worker  }                                                                          \
37*6777b538SAndroid Build Coastguard Worker  objctype classname::Get() const {                                          \
38*6777b538SAndroid Build Coastguard Worker    return objc_storage_->obj;                                               \
39*6777b538SAndroid Build Coastguard Worker  }                                                                          \
40*6777b538SAndroid Build Coastguard Worker  }  // namespace base::apple
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker#define GENERATE_STRONG_OBJC_TYPE(name) \
43*6777b538SAndroid Build Coastguard Worker  OWNED_OBJC_IMPL(Owned##name, name*, __strong)
44*6777b538SAndroid Build Coastguard Worker#define GENERATE_STRONG_OBJC_PROTOCOL(name) \
45*6777b538SAndroid Build Coastguard Worker  OWNED_OBJC_IMPL(Owned##name, id<name>, __strong)
46*6777b538SAndroid Build Coastguard Worker#define GENERATE_WEAK_OBJC_TYPE(name) OWNED_OBJC_IMPL(Weak##name, name*, __weak)
47*6777b538SAndroid Build Coastguard Worker#define GENERATE_WEAK_OBJC_PROTOCOL(name) \
48*6777b538SAndroid Build Coastguard Worker  OWNED_OBJC_IMPL(Weak##name, id<name>, __weak)
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker#include "base/apple/owned_objc_types.h"
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker#undef GENERATE_STRONG_OBJC_TYPE
53*6777b538SAndroid Build Coastguard Worker#undef GENERATE_STRONG_OBJC_PROTOCOL
54*6777b538SAndroid Build Coastguard Worker#undef GENERATE_WEAK_OBJC_TYPE
55*6777b538SAndroid Build Coastguard Worker#undef GENERATE_WEAK_OBJC_PROTOCOL
56*6777b538SAndroid Build Coastguard Worker#undef OWNED_OBJC_IMPL
57