1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef META_INTERFACE_OBJECT_MACROS_H 16 #define META_INTERFACE_OBJECT_MACROS_H 17 18 #include <base/containers/atomics.h> 19 20 #include <meta/base/interface_macros.h> 21 #include <meta/interface/intf_lifecycle.h> 22 23 /** 24 * @brief Implement reference counting with ILifecycle support for destruction. 25 */ 26 #define META_IMPLEMENT_REF_COUNT() \ 27 int32_t refcnt_ { 0 }; \ 28 void Ref() override \ 29 { \ 30 BASE_NS::AtomicIncrement(&refcnt_); \ 31 } \ 32 void Unref() override \ 33 { \ 34 if (BASE_NS::AtomicDecrement(&refcnt_) == 0) { \ 35 if (auto i = this->GetInterface(::META_NS::ILifecycle::UID)) { \ 36 static_cast<::META_NS::ILifecycle*>(i)->Destroy(); \ 37 } \ 38 delete this; \ 39 } \ 40 } 41 42 #endif 43