CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Variant.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
11
12#include <variant>
13
14namespace CeresEngine {
15 template<typename... Ts> class Variant : private std::variant<Ts...> {
16 private:
17 using Base = std::variant<Ts...>;
18
19 public:
20 using Base::Base;
21 using Base::emplace;
22 using Base::swap;
23
24 public:
25 [[nodiscard]] constexpr std::size_t getIndex() const noexcept { return base().index(); }
26
27 template<typename T> [[nodiscard]] constexpr bool is() const noexcept { return std::holds_alternative<T>(base()); }
28
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())); }
33
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()); }
36
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()); }
41
42 public: // Comparison Operators
43 friend constexpr bool operator==(const Variant& lhs, const Variant& rhs) { return lhs.base() == rhs.base(); }
44 friend constexpr bool operator!=(const Variant& lhs, const Variant& rhs) { return lhs.base() != rhs.base(); }
45 friend constexpr bool operator>(const Variant& lhs, const Variant& rhs) { return lhs.base() > rhs.base(); }
46 friend constexpr bool operator>=(const Variant& lhs, const Variant& rhs) { return lhs.base() >= rhs.base(); }
47 friend constexpr bool operator<(const Variant& lhs, const Variant& rhs) { return lhs.base() < rhs.base(); }
48 friend constexpr bool operator<=(const Variant& lhs, const Variant& rhs) { return lhs.base() <= rhs.base(); }
49
50 private:
51 template<typename U> friend struct std::hash;
52
53 [[nodiscard]] Base& base() & { return static_cast<Base&>(*this); }
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); }
57 };
58
59} // namespace CeresEngine
60
62template<typename... Ts> struct std::hash<CeresEngine::Variant<Ts...>> {
63 using Type = CeresEngine::Variant<Ts...>;
64 inline size_t operator()(const Type& object) const noexcept { return CeresEngine::hash(object.base()); }
65};
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