10485dae0Sopenharmony_ci/*
20485dae0Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
30485dae0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40485dae0Sopenharmony_ci * you may not use this file except in compliance with the License.
50485dae0Sopenharmony_ci * You may obtain a copy of the License at
60485dae0Sopenharmony_ci *
70485dae0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
80485dae0Sopenharmony_ci *
90485dae0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100485dae0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110485dae0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120485dae0Sopenharmony_ci * See the License for the specific language governing permissions and
130485dae0Sopenharmony_ci * limitations under the License.
140485dae0Sopenharmony_ci */
150485dae0Sopenharmony_ci
160485dae0Sopenharmony_ci#ifndef AIE_MACROS_H
170485dae0Sopenharmony_ci#define AIE_MACROS_H
180485dae0Sopenharmony_ci
190485dae0Sopenharmony_ci#include <cstdlib>
200485dae0Sopenharmony_ci#include <new>
210485dae0Sopenharmony_ci
220485dae0Sopenharmony_cinamespace OHOS {
230485dae0Sopenharmony_cinamespace AI {
240485dae0Sopenharmony_ci/**
250485dae0Sopenharmony_ci * If x is true, return ret, pass otherwise
260485dae0Sopenharmony_ci */
270485dae0Sopenharmony_ci#define CHK_RET(x, ret) \
280485dae0Sopenharmony_ci    do { \
290485dae0Sopenharmony_ci        if (x) { \
300485dae0Sopenharmony_ci            return ret; \
310485dae0Sopenharmony_ci        } \
320485dae0Sopenharmony_ci    } while (0)
330485dae0Sopenharmony_ci
340485dae0Sopenharmony_ci/**
350485dae0Sopenharmony_ci * If x is true, return void, pass otherwise
360485dae0Sopenharmony_ci */
370485dae0Sopenharmony_ci#define CHK_RET_NONE(x) \
380485dae0Sopenharmony_ci    do { \
390485dae0Sopenharmony_ci        if (x) { \
400485dae0Sopenharmony_ci            return; \
410485dae0Sopenharmony_ci        } \
420485dae0Sopenharmony_ci    } while (0)
430485dae0Sopenharmony_ci
440485dae0Sopenharmony_ci/**
450485dae0Sopenharmony_ci * Try assign classname to var, assign nullptr if failed
460485dae0Sopenharmony_ci */
470485dae0Sopenharmony_ci#define AIE_NEW(var, classname) \
480485dae0Sopenharmony_ci    do { \
490485dae0Sopenharmony_ci        var = new(std::nothrow) classname; \
500485dae0Sopenharmony_ci    } while (0)
510485dae0Sopenharmony_ci
520485dae0Sopenharmony_ci/**
530485dae0Sopenharmony_ci * Try delete the pointer p, and set p to nullptr.
540485dae0Sopenharmony_ci */
550485dae0Sopenharmony_ci#define AIE_DELETE(p) \
560485dae0Sopenharmony_ci    do { \
570485dae0Sopenharmony_ci        if (p ==  nullptr) { \
580485dae0Sopenharmony_ci            break; \
590485dae0Sopenharmony_ci        } \
600485dae0Sopenharmony_ci        delete p; \
610485dae0Sopenharmony_ci        p = nullptr; \
620485dae0Sopenharmony_ci    } while (0)
630485dae0Sopenharmony_ci
640485dae0Sopenharmony_ci/**
650485dae0Sopenharmony_ci * Try delete the pointer p[], and set p to nullptr.
660485dae0Sopenharmony_ci */
670485dae0Sopenharmony_ci#define AIE_DELETE_ARRAY(p) \
680485dae0Sopenharmony_ci    do { \
690485dae0Sopenharmony_ci        if (p == nullptr) { \
700485dae0Sopenharmony_ci            break; \
710485dae0Sopenharmony_ci        } \
720485dae0Sopenharmony_ci        delete[] p; \
730485dae0Sopenharmony_ci        p = nullptr; \
740485dae0Sopenharmony_ci    } while (0)
750485dae0Sopenharmony_ci
760485dae0Sopenharmony_ci#undef FORBID_COPY_AND_ASSIGN
770485dae0Sopenharmony_ci/**
780485dae0Sopenharmony_ci * Forbid copy and assign classname, for singleton pattern.
790485dae0Sopenharmony_ci */
800485dae0Sopenharmony_ci#define FORBID_COPY_AND_ASSIGN(CLASSNAME) \
810485dae0Sopenharmony_ciprivate: \
820485dae0Sopenharmony_ci    CLASSNAME(const CLASSNAME&) = delete; \
830485dae0Sopenharmony_ci    CLASSNAME& operator = (const CLASSNAME&) = delete; \
840485dae0Sopenharmony_ci    CLASSNAME(CLASSNAME&&) = delete; \
850485dae0Sopenharmony_ci    CLASSNAME& operator = (CLASSNAME&&) = delete
860485dae0Sopenharmony_ci
870485dae0Sopenharmony_ci#undef FORBID_CREATE_BY_SELF
880485dae0Sopenharmony_ci/**
890485dae0Sopenharmony_ci * Forbid create classname, for singleton pattern.
900485dae0Sopenharmony_ci */
910485dae0Sopenharmony_ci#define FORBID_CREATE_BY_SELF(CLASSNAME) \
920485dae0Sopenharmony_ciprivate: \
930485dae0Sopenharmony_ci    CLASSNAME(); \
940485dae0Sopenharmony_ci    ~CLASSNAME()
950485dae0Sopenharmony_ci} // namespace AI
960485dae0Sopenharmony_ci} // namespace OHOS
970485dae0Sopenharmony_ci
980485dae0Sopenharmony_ci#endif // AIE_MACROS_H
99