15 template<
typename...
Ts>
class Variant :
private std::variant<Ts...> {
17 using Base = std::variant<Ts...>;
25 [[nodiscard]]
constexpr std::size_t
getIndex() const noexcept {
return base().index(); }
27 template<
typename T> [[nodiscard]]
constexpr bool is() const noexcept {
return std::holds_alternative<T>(
base()); }
29 template<
typename T>
constexpr T&
as() & {
return std::get<T>(
base()); }
30 template<
typename T>
constexpr T&&
as() && {
return std::forward<T>(std::get<T>(
base())); }
31 template<
typename T> [[nodiscard]] [[nodiscard]]
constexpr const T&
as() const& {
return std::get<T>(
base()); }
32 template<
typename T>
constexpr const T&&
as() const&& {
return std::forward<T>(std::get<T>(
base())); }
34 template<
typename T>
constexpr std::add_pointer_t<T>
asIf() noexcept {
return std::get_if<T>(
base()); }
35 template<
typename T>
constexpr std::add_pointer_t<const T>
asIf() const noexcept {
return std::get_if<T>(
base()); }
37 template<
typename Visitor>
constexpr decltype(
auto)
visit(Visitor&& visitor) & {
return std::visit(visitor,
base()); }
38 template<
typename Visitor>
constexpr decltype(
auto)
visit(Visitor&& visitor) && {
return std::visit(visitor,
base()); }
39 template<
typename Visitor>
constexpr decltype(
auto)
visit(Visitor&& visitor)
const& {
return std::visit(visitor,
base()); }
40 template<
typename Visitor>
constexpr decltype(
auto)
visit(Visitor&& visitor)
const&& {
return std::visit(visitor,
base()); }
51 template<
typename U>
friend struct std::hash;
54 [[nodiscard]]
Base&&
base() && {
return static_cast<Base&&
>(*this); }
55 [[nodiscard]]
const Base&
base() const& {
return static_cast<const Base&
>(*this); }
56 [[nodiscard]]
const Base&&
base() const&& {
return static_cast<const Base&&
>(*this); }
62template<
typename... Ts>
struct std::hash<
CeresEngine::Variant<Ts...>> {
64 inline size_t operator()(
const Type&
object)
const noexcept {
return CeresEngine::hash(
object.base()); }
Definition Variant.hpp:15
Base & base() &
Definition Variant.hpp:53
friend constexpr bool operator>=(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:46
Base && base() &&
Definition Variant.hpp:54
std::variant< Ts... > Base
Definition Variant.hpp:17
const Base && base() const &&
Definition Variant.hpp:56
friend constexpr bool operator<=(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:48
constexpr decltype(auto) visit(Visitor &&visitor) &&
Definition Variant.hpp:38
constexpr T && as() &&
Definition Variant.hpp:30
friend constexpr bool operator>(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:45
constexpr decltype(auto) visit(Visitor &&visitor) const &
Definition Variant.hpp:39
constexpr T & as() &
Definition Variant.hpp:29
constexpr std::size_t getIndex() const noexcept
Definition Variant.hpp:25
constexpr const T & as() const &
Definition Variant.hpp:31
constexpr decltype(auto) visit(Visitor &&visitor) &
Definition Variant.hpp:37
const Base & base() const &
Definition Variant.hpp:55
constexpr std::add_pointer_t< T > asIf() noexcept
Definition Variant.hpp:34
friend constexpr bool operator<(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:47
constexpr bool is() const noexcept
Definition Variant.hpp:27
friend constexpr bool operator==(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:43
constexpr decltype(auto) visit(Visitor &&visitor) const &&
Definition Variant.hpp:40
friend constexpr bool operator!=(const Variant &lhs, const Variant &rhs)
Definition Variant.hpp:44
constexpr std::add_pointer_t< const T > asIf() const noexcept
Definition Variant.hpp:35
constexpr const T && as() const &&
Definition Variant.hpp:32
Definition Application.hpp:19
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25