58 lines
957 B
C++
58 lines
957 B
C++
/*
|
|
* utility_staticpointer.hpp
|
|
*
|
|
* Created on: Jun 8, 2021
|
|
* Author: erki
|
|
*/
|
|
|
|
#ifndef SKULLC_UTILITY_STATICPOINTER_HPP_
|
|
#define SKULLC_UTILITY_STATICPOINTER_HPP_
|
|
|
|
#include <utility>
|
|
|
|
namespace Utility
|
|
{
|
|
|
|
template<typename T>
|
|
struct StaticPointer
|
|
{
|
|
using value_type = T;
|
|
|
|
alignas(value_type) unsigned char storage[sizeof(value_type)];
|
|
|
|
template<class... Args>
|
|
value_type& setup(Args&&... args)
|
|
{
|
|
initialized_ = true;
|
|
return *(new (storage) value_type(std::forward<Args>(args)...));
|
|
}
|
|
|
|
value_type& operator*() const
|
|
{
|
|
return reinterpret_cast<T*>(storage);
|
|
}
|
|
|
|
value_type* operator->() const noexcept
|
|
{
|
|
return reinterpret_cast<T*>(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_ */
|