Loading...
Searching...
No Matches
singleton.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the Apache License, Version 2.0 (the "Apache License")
5// with the following modification; you may not use this file except in
6// compliance with the Apache License and the following modification to it:
7// Section 6. Trademarks. is deleted and replaced with:
8//
9// 6. Trademarks. This License does not grant permission to use the trade
10// names, trademarks, service marks, or product names of the Licensor
11// and its affiliates, except as required to comply with Section 4(c) of
12// the License and to reproduce the content of the NOTICE file.
13//
14// You may obtain a copy of the Apache License at
15//
16// http://www.apache.org/licenses/LICENSE-2.0
17//
18// Unless required by applicable law or agreed to in writing, software
19// distributed under the Apache License with the above modification is
20// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21// KIND, either express or implied. See the Apache License for the specific
22// language governing permissions and limitations under the Apache License.
23//
24#ifndef PXR_BASE_TF_SINGLETON_H
25#define PXR_BASE_TF_SINGLETON_H
26
106
107#include "pxr/pxr.h"
109
110#include <atomic>
111
112PXR_NAMESPACE_OPEN_SCOPE
113
121template <class T>
123public:
137 inline static T& GetInstance() {
138 // Suppress undefined-var-template warnings from clang; _instance
139 // is expected to be instantiated in another translation unit via
140 // the TF_INSTANTIATE_SINGLETON macro.
141 ARCH_PRAGMA_PUSH
142 ARCH_PRAGMA_UNDEFINED_VAR_TEMPLATE
143 T *p = _instance.load();
144 if (!p) {
145 p = _CreateInstance(_instance);
146 }
147 ARCH_PRAGMA_POP
148 return *p;
149 }
150
155 inline static bool CurrentlyExists() {
156 // Suppress undefined-var-template warnings from clang; _instance
157 // is expected to be instantiated in another translation unit via
158 // the TF_INSTANTIATE_SINGLETON macro.
159 ARCH_PRAGMA_PUSH
160 ARCH_PRAGMA_UNDEFINED_VAR_TEMPLATE
161 return static_cast<bool>(_instance.load());
162 ARCH_PRAGMA_POP
163 }
164
183 inline static void SetInstanceConstructed(T& instance);
184
193 inline static void DeleteInstance();
194
195private:
196 static T *_CreateInstance(std::atomic<T *> &instance);
197
198 static std::atomic<T *> _instance;
199};
200
201PXR_NAMESPACE_CLOSE_SCOPE
202
203#endif
Manage a single instance of an object (see.
Definition: singleton.h:122
static void DeleteInstance()
Destroy the sole instance object of type T, if it exists.
static void SetInstanceConstructed(T &instance)
Indicate that the sole instance object has already been created.
static bool CurrentlyExists()
Return whether or not the single object of type T is currently in existence.
Definition: singleton.h:155
static T & GetInstance()
Return a reference to an object of type T, creating it if necessary.
Definition: singleton.h:137
Pragmas for controlling compiler-specific behaviors.