#include <stdio.h>
#include <vector>
#include <memory>
#include <mutex>
template <typename T>
class Singleton : public T {
private:
static std::unique_ptr<T> instance;
static std::mutex mutex;
Singleton();
Singleton<T>(const Singleton<T>&) = delete;
Singleton<T>&operator=(const Singleton<T>&) = delete;
public:
static T& getInstance() {
{
std::lock_guard<std::mutex> lock(mutex);
if (nullptr == instance) {
instance.reset(new T {});
}
}
return *instance.get();
}
static void deleteInstance() {
instance.reset();
}
~Singleton();
};
template<typename T>
std::unique_ptr<T> Singleton<T>::instance { nullptr };
template<typename T>
std::mutex Singleton<T>::mutex {};
template<typename T>
inline Singleton<T>::Singleton() {}
template<typename T>
inline Singleton<T>::~Singleton() {}
int main() {
auto & vec = Singleton<std::vector<int>>::getInstance();
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
for (auto v : vec) {
printf("%d\n", v);
}
Singleton<std::vector<int>>::deleteInstance();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxtdXRleD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBTaW5nbGV0b24gOiBwdWJsaWMgVCB7CiAgcHJpdmF0ZToKICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFQ+IGluc3RhbmNlOwogIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OwogIFNpbmdsZXRvbigpOwoKICBTaW5nbGV0b248VD4oY29uc3QgU2luZ2xldG9uPFQ+JikgPSBkZWxldGU7CiAgU2luZ2xldG9uPFQ+Jm9wZXJhdG9yPShjb25zdCBTaW5nbGV0b248VD4mKSA9IGRlbGV0ZTsKCiAgcHVibGljOgogIHN0YXRpYyBUJiBnZXRJbnN0YW5jZSgpIHsKICAgIHsKICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOwogICAgICBpZiAobnVsbHB0ciA9PSBpbnN0YW5jZSkgewogICAgICAgIGluc3RhbmNlLnJlc2V0KG5ldyBUIHt9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICppbnN0YW5jZS5nZXQoKTsKICB9CiAgc3RhdGljIHZvaWQgZGVsZXRlSW5zdGFuY2UoKSB7CiAgICBpbnN0YW5jZS5yZXNldCgpOwogIH0KICB+U2luZ2xldG9uKCk7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6OnVuaXF1ZV9wdHI8VD4gU2luZ2xldG9uPFQ+OjppbnN0YW5jZSB7IG51bGxwdHIgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0ZDo6bXV0ZXggU2luZ2xldG9uPFQ+OjptdXRleCB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmlubGluZSBTaW5nbGV0b248VD46OlNpbmdsZXRvbigpIHt9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgppbmxpbmUgU2luZ2xldG9uPFQ+Ojp+U2luZ2xldG9uKCkge30KCmludCBtYWluKCkgewogIGF1dG8gJiB2ZWMgPSBTaW5nbGV0b248c3RkOjp2ZWN0b3I8aW50Pj46OmdldEluc3RhbmNlKCk7CiAgdmVjLnB1c2hfYmFjaygxKTsKICB2ZWMucHVzaF9iYWNrKDIpOwogIHZlYy5wdXNoX2JhY2soMyk7CiAgZm9yIChhdXRvIHYgOiB2ZWMpIHsKICAgIHByaW50ZigiJWRcbiIsIHYpOwogIH0KICBTaW5nbGV0b248c3RkOjp2ZWN0b3I8aW50Pj46OmRlbGV0ZUluc3RhbmNlKCk7CiAgcmV0dXJuIDA7Cn0=