Orange/include/Orange/Core/Variant.h

52 lines
1.3 KiB
C++

#pragma once
#include <Orange/Core/AlignedStorage.h>
#include <Orange/Core/Traits.h>
#include <cstring>
namespace orange
{
template <typename... Types>
class Variant
{
public:
static constexpr size_t MaxElementSize = Max({sizeof(Types)...});
static constexpr size_t Alignment = Max({alignof(Types)...});
explicit Variant()
{
}
template <typename T, typename... Args>
Variant(Args&&... args)
{
Construct<T>(Forward<Args>(args)...);
}
template <typename T, typename... Args>
void Construct(Args&&... args)
{
new (Ptr<T>()) T(Forward<Args>(args)...);
}
template <typename T>
void Destruct()
{
Ptr<T>()->~T();
}
void Clear()
{
std::memset(&data, 0, sizeof(data));
}
template <typename T> T* Ptr() { return reinterpret_cast<T*> (data.data); }
template <typename T> const T* Ptr() const { return reinterpret_cast<const T*>(data.data); }
template <typename T> T& Get() { return *Ptr<T>(); }
template <typename T> const T& Get() const { return *Ptr<T>(); }
private:
AlignedStorage<MaxElementSize, Alignment> data;
};
}