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>
303d0407baSopenharmony_ciclass RgaSingleton {
313d0407baSopenharmony_cipublic:
323d0407baSopenharmony_ci    static TYPE& getInstance()
333d0407baSopenharmony_ci    {
343d0407baSopenharmony_ci        Mutex::Autolock _l(sLock);
353d0407baSopenharmony_ci        TYPE* instance = sInstance;
363d0407baSopenharmony_ci        if (instance == nullptr) {
373d0407baSopenharmony_ci            instance = new TYPE();
383d0407baSopenharmony_ci            sInstance = instance;
393d0407baSopenharmony_ci        }
403d0407baSopenharmony_ci        return *instance;
413d0407baSopenharmony_ci    }
423d0407baSopenharmony_ci    static bool hasInstance()
433d0407baSopenharmony_ci    {
443d0407baSopenharmony_ci        Mutex::Autolock _l(sLock);
453d0407baSopenharmony_ci        return sInstance != nullptr;
463d0407baSopenharmony_ci    }
473d0407baSopenharmony_ci
483d0407baSopenharmony_ciprotected:
493d0407baSopenharmony_ci    ~RgaSingleton() { }
503d0407baSopenharmony_ci    RgaSingleton() { }
513d0407baSopenharmony_ci
523d0407baSopenharmony_ciprivate:
533d0407baSopenharmony_ci    RgaSingleton(const RgaSingleton&);
543d0407baSopenharmony_ci    RgaSingleton& operator = (const RgaSingleton&);
553d0407baSopenharmony_ci    static Mutex sLock;
563d0407baSopenharmony_ci    static TYPE* sInstance;
573d0407baSopenharmony_ci};
583d0407baSopenharmony_ci
593d0407baSopenharmony_ci#if defined(__clang__)
603d0407baSopenharmony_ci#pragma clang diagnostic pop
613d0407baSopenharmony_ci#endif
623d0407baSopenharmony_ci
633d0407baSopenharmony_ci#define RGA_SINGLETON_STATIC_INSTANCE(TYPE) do { \
643d0407baSopenharmony_ci    template<> ::RgaMutex  \
653d0407baSopenharmony_ci        (::RgaSingleton< TYPE >::sLock)(::RgaMutex::PRIVATE);  \
663d0407baSopenharmony_ci    template<> TYPE* ::RgaSingleton< TYPE >::sInstance(nullptr);  /* NOLINT */ \
673d0407baSopenharmony_ci    template class ::RgaSingleton< TYPE >; \
683d0407baSopenharmony_ci} while (0)
693d0407baSopenharmony_ci
703d0407baSopenharmony_ci#endif // _LIBS_RGA_SINGLETON_H
71