1794c9f46Sopenharmony_ci/*
2794c9f46Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3794c9f46Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4794c9f46Sopenharmony_ci * you may not use this file except in compliance with the License.
5794c9f46Sopenharmony_ci * You may obtain a copy of the License at
6794c9f46Sopenharmony_ci *
7794c9f46Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8794c9f46Sopenharmony_ci *
9794c9f46Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10794c9f46Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11794c9f46Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12794c9f46Sopenharmony_ci * See the License for the specific language governing permissions and
13794c9f46Sopenharmony_ci * limitations under the License.
14794c9f46Sopenharmony_ci */
15794c9f46Sopenharmony_ci
16794c9f46Sopenharmony_ci#ifndef OHOS_DISTRIBUTED_HARDWARE_SINGLE_INSTANCE_H
17794c9f46Sopenharmony_ci#define OHOS_DISTRIBUTED_HARDWARE_SINGLE_INSTANCE_H
18794c9f46Sopenharmony_ci
19794c9f46Sopenharmony_cinamespace OHOS {
20794c9f46Sopenharmony_cinamespace DistributedHardware {
21794c9f46Sopenharmony_ci#define REMOVE_NO_USE_CONSTRUCTOR(className)            \
22794c9f46Sopenharmony_ciprivate:                                                \
23794c9f46Sopenharmony_ci    className(const className&) = delete;               \
24794c9f46Sopenharmony_ci    className& operator= (const className&) = delete;   \
25794c9f46Sopenharmony_ci    className(className&&) = delete;                    \
26794c9f46Sopenharmony_ci    className& operator= (className&&) = delete;        \
27794c9f46Sopenharmony_ci
28794c9f46Sopenharmony_ci#define DECLARE_SINGLE_INSTANCE_BASE(className)         \
29794c9f46Sopenharmony_cipublic:                                                 \
30794c9f46Sopenharmony_ci    static className & GetInstance();                   \
31794c9f46Sopenharmony_ciprivate:                                                \
32794c9f46Sopenharmony_ci    className(const className&) = delete;               \
33794c9f46Sopenharmony_ci    className& operator= (const className&) = delete;   \
34794c9f46Sopenharmony_ci    className(className&&) = delete;                    \
35794c9f46Sopenharmony_ci    className& operator= (className&&) = delete;        \
36794c9f46Sopenharmony_ci
37794c9f46Sopenharmony_ci#define DECLARE_SINGLE_INSTANCE(className)              \
38794c9f46Sopenharmony_ci    DECLARE_SINGLE_INSTANCE_BASE(className)             \
39794c9f46Sopenharmony_ciprivate:                                                \
40794c9f46Sopenharmony_ci    className() = default;                              \
41794c9f46Sopenharmony_ci    virtual ~className() = default;                     \
42794c9f46Sopenharmony_ci
43794c9f46Sopenharmony_ci#define IMPLEMENT_SINGLE_INSTANCE(className)            \
44794c9f46Sopenharmony_ciclassName & className::GetInstance()                    \
45794c9f46Sopenharmony_ci{                                                       \
46794c9f46Sopenharmony_ci    static className instance;                          \
47794c9f46Sopenharmony_ci    return instance;                                    \
48794c9f46Sopenharmony_ci}
49794c9f46Sopenharmony_ci} // namespace DistributedHardware
50794c9f46Sopenharmony_ci} // namespace OHOS
51794c9f46Sopenharmony_ci#endif // OHOS_DISTRIBUTED_HARDWARE_SINGLE_INSTANCE_H
52