52 lines
1.3 KiB
C++
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;
|
|
};
|
|
}
|