diff --git a/Utility/Inc/utility_staticpointer.hpp b/Utility/Inc/utility_staticpointer.hpp new file mode 100644 index 0000000..c80db2b --- /dev/null +++ b/Utility/Inc/utility_staticpointer.hpp @@ -0,0 +1,57 @@ +/* + * utility_staticpointer.hpp + * + * Created on: Jun 8, 2021 + * Author: erki + */ + +#ifndef SKULLC_UTILITY_STATICPOINTER_HPP_ +#define SKULLC_UTILITY_STATICPOINTER_HPP_ + +#include + +namespace Utility +{ + +template +struct StaticPointer +{ + using value_type = T; + + alignas(value_type) unsigned char storage[sizeof(value_type)]; + + template + value_type& setup(Args&&... args) + { + initialized_ = true; + return *(new (storage) value_type(std::forward(args)...)); + } + + value_type& operator*() const + { + return reinterpret_cast(storage); + } + + value_type* operator->() const noexcept + { + return reinterpret_cast(storage); + } + + constexpr explicit operator bool() const + { + return isInitialized(); + } + + constexpr bool isInitialized() const + { + return initialized_; + } + +private: + bool initialized_ = false; +}; + +}// namespace Utility + + +#endif /* SKULLC_UTILITY_STATICPOINTER_HPP_ */