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