mirror of https://github.com/bsnes-emu/bsnes.git
40 lines
598 B
C++
40 lines
598 B
C++
#pragma once
|
|
|
|
namespace nall {
|
|
|
|
template<typename T>
|
|
struct Instance {
|
|
~Instance() {
|
|
destruct();
|
|
}
|
|
|
|
auto operator()() -> T& {
|
|
return instance.object;
|
|
}
|
|
|
|
template<typename... P>
|
|
auto construct(P&&... p) {
|
|
if(constructed) return;
|
|
constructed = true;
|
|
new((void*)(&instance.object)) T(forward<P>(p)...);
|
|
}
|
|
|
|
auto destruct() -> void {
|
|
if(!constructed) return;
|
|
constructed = false;
|
|
instance.object.~T();
|
|
}
|
|
|
|
private:
|
|
bool constructed = false;
|
|
union Union {
|
|
Union() {}
|
|
~Union() {}
|
|
|
|
T object;
|
|
char storage[sizeof(T)];
|
|
} instance;
|
|
};
|
|
|
|
}
|