13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
33d0407baSopenharmony_ci * Authors:
43d0407baSopenharmony_ci *    Zhiqin Wei <wzq@rock-chips.com>
53d0407baSopenharmony_ci *
63d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
73d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
83d0407baSopenharmony_ci * You may obtain a copy of the License at
93d0407baSopenharmony_ci *
103d0407baSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
113d0407baSopenharmony_ci *
123d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
133d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
143d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153d0407baSopenharmony_ci * See the License for the specific language governing permissions and
163d0407baSopenharmony_ci * limitations under the License.
173d0407baSopenharmony_ci */
183d0407baSopenharmony_ci
193d0407baSopenharmony_ci#ifndef _LIBS_RGA_SINGLETON_H
203d0407baSopenharmony_ci#define _LIBS_RGA_SINGLETON_H
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#include "RgaMutex.h"
233d0407baSopenharmony_ci
243d0407baSopenharmony_ci#if defined(__clang__)
253d0407baSopenharmony_ci#pragma clang diagnostic push
263d0407baSopenharmony_ci#pragma clang diagnostic ignored "-Wundefined-var-template"
273d0407baSopenharmony_ci#endif
283d0407baSopenharmony_ci
293d0407baSopenharmony_citemplate <typename TYPE> class RgaSingleton {
303d0407baSopenharmony_cipublic:
313d0407baSopenharmony_ci    static TYPE& getInstance()
323d0407baSopenharmony_ci    {
333d0407baSopenharmony_ci        RgaMutex::Autolock _l(sLock);
343d0407baSopenharmony_ci        TYPE *instance = sInstance;
353d0407baSopenharmony_ci        if (instance == nullptr) {
363d0407baSopenharmony_ci            instance = new TYPE();
373d0407baSopenharmony_ci            sInstance = instance;
383d0407baSopenharmony_ci        }
393d0407baSopenharmony_ci        return *instance;
403d0407baSopenharmony_ci    }
413d0407baSopenharmony_ci    static bool hasInstance()
423d0407baSopenharmony_ci    {
433d0407baSopenharmony_ci        RgaMutex::Autolock _l(sLock);
443d0407baSopenharmony_ci        return sInstance != nullptr;
453d0407baSopenharmony_ci    }
463d0407baSopenharmony_ci
473d0407baSopenharmony_ciprotected:
483d0407baSopenharmony_ci    ~RgaSingleton()
493d0407baSopenharmony_ci    {
503d0407baSopenharmony_ci    }
513d0407baSopenharmony_ci    RgaSingleton()
523d0407baSopenharmony_ci    {
533d0407baSopenharmony_ci    }
543d0407baSopenharmony_ci
553d0407baSopenharmony_ciprivate:
563d0407baSopenharmony_ci    RgaSingleton(const RgaSingleton &);
573d0407baSopenharmony_ci    RgaSingleton &operator=(const RgaSingleton &);
583d0407baSopenharmony_ci    static RgaMutex sLock;
593d0407baSopenharmony_ci    static TYPE *sInstance;
603d0407baSopenharmony_ci};
613d0407baSopenharmony_ci
623d0407baSopenharmony_ci#if defined(__clang__)
633d0407baSopenharmony_ci#pragma clang diagnostic pop
643d0407baSopenharmony_ci#endif
653d0407baSopenharmony_ci
663d0407baSopenharmony_ci#define RGA_SINGLETON_STATIC_INSTANCE(TYPE)                                                                            \
673d0407baSopenharmony_ci    do {                                                                                                               \
683d0407baSopenharmony_ci        template <>::RgaMutex(::RgaSingleton<TYPE>::sLock)(::RgaMutex::PRIVATE);                                       \
693d0407baSopenharmony_ci        template <> TYPE * ::RgaSingleton<TYPE>::sInstance(nullptr); /* NOLINT */                                      \
703d0407baSopenharmony_ci        template class ::RgaSingleton<TYPE>;                                                                           \
713d0407baSopenharmony_ci    } while (0)
723d0407baSopenharmony_ci
733d0407baSopenharmony_ci#endif // _LIBS_RGA_SINGLETON_H
74