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
13
16
18
19 // Helper class to simply cast expressions between boolean, float, and integral types.
20 class Variant {
21 public:
22 using BoolType = bool;
23 using IntType = long long;
25
26 enum class Types {
28 Bool,
29 Int,
30 Real,
31 Array,
32 };
33
34 Variant() = default;
35 Variant(const Variant&) = default;
36 Variant(Variant&&) = default;
42
43 Variant& operator=(const Variant&) = default;
44 Variant& operator=(Variant&&) = default;
45
58
62
63 // Converts this variant to a boolean type and returns its value.
65
66 // Converts this variant to an integral type and returns its value.
68
69 // Converts this variant to a real type and returns its value.
71
72 // Returns -1 if this variant is less than 'rhs', 0 if they are equal, and 1 if this variant is greater than 'rhs'.
73 [[nodiscard]] Int32 compareWith(const Variant& rhs) const;
74
75 // Returns the sub variant of the array value, or the default variant if this is not an array or the index is out of bounds.
76 [[nodiscard]] Variant arraySub(std::size_t idx) const;
77
78 // Returns true if this variant is not undefined.
79 [[nodiscard]] inline bool isValid() const { return (getType() != Types::Undefined); }
80
81 // Returns true if this variant is a boolean type.
82 [[nodiscard]] inline bool isBoolean() const { return (getType() == Types::Bool); }
83
84 // Returns true if this variant is an integral type.
85 [[nodiscard]] inline bool isInteger() const { return (getType() == Types::Int); }
86
87 // Returns true if this variant is a real type.
88 [[nodiscard]] inline bool isReal() const { return (getType() == Types::Real); }
89
90 // Returns true if this variant is an array type.
91 [[nodiscard]] inline bool isArray() const { return (getType() == Types::Array); }
92
93 // Returns the boolean value.
94 [[nodiscard]] inline BoolType getBoolean() const { return mBool; }
95
96 // Returns the integral value.
97 [[nodiscard]] inline IntType getInteger() const { return mInt; }
98
99 // Returns the real value.
100 [[nodiscard]] inline RealType getReal() const { return mReal; }
101
102 // Returns the array value.
103 [[nodiscard]] inline const Vector<Variant>& getArray() const { return mArray; }
104
105 // Returns the current internal type of this variant.
106 [[nodiscard]] inline Types getType() const { return mType; }
107
108 // Shortcut for IsValid().
109 inline operator bool() const { return isValid(); }
110
111 // Returns a variant, parsed from the specified string (e.g. "true" for a boolean type, or "1.5" for a real type).
112 static Variant parseFrom(const String& s);
113
114 // Returns the type that is used when two variants are added, subtracted etc.
115 static Types findCommonType(const Variant& lhs, const Variant& rhs);
116
117 // Returns this variant as string.
119
120 // Retunrs true if this variant can be represented as a string (see ToString).
122
123 private:
129 };
130
131 Variant operator==(const Variant& lhs, const Variant& rhs);
132 Variant operator!=(const Variant& lhs, const Variant& rhs);
133 Variant operator<(const Variant& lhs, const Variant& rhs);
134 Variant operator<=(const Variant& lhs, const Variant& rhs);
135 Variant operator>(const Variant& lhs, const Variant& rhs);
136 Variant operator>=(const Variant& lhs, const Variant& rhs);
137 Variant operator+(const Variant& lhs, const Variant& rhs);
138 Variant operator-(const Variant& lhs, const Variant& rhs);
139 Variant operator*(const Variant& lhs, const Variant& rhs);
140 Variant operator/(const Variant& lhs, const Variant& rhs);
141 Variant operator%(const Variant& lhs, const Variant& rhs);
142 Variant operator|(const Variant& lhs, const Variant& rhs);
143 Variant operator&(const Variant& lhs, const Variant& rhs);
144 Variant operator^(const Variant& lhs, const Variant& rhs);
145 Variant operator<<(const Variant& lhs, const Variant& rhs);
146 Variant operator>>(const Variant& lhs, const Variant& rhs);
147
148} // namespace CeresEngine::ShaderCompiler
Definition Variant.hpp:20
IntType mInt
Definition Variant.hpp:126
Types getType() const
Definition Variant.hpp:106
long long IntType
Definition Variant.hpp:23
double RealType
Definition Variant.hpp:24
Variant & operator-=(const Variant &rhs)
bool isBoolean() const
Definition Variant.hpp:82
Variant(const Vector< Variant > &subValues)
static Variant parseFrom(const String &s)
Variant & operator|=(const Variant &rhs)
Variant & operator*=(const Variant &rhs)
BoolType mBool
Definition Variant.hpp:125
bool isValid() const
Definition Variant.hpp:79
Variant(Vector< Variant > &&subValues)
bool isInteger() const
Definition Variant.hpp:85
Int32 compareWith(const Variant &rhs) const
RealType getReal() const
Definition Variant.hpp:100
Types
Definition Variant.hpp:26
RealType mReal
Definition Variant.hpp:127
const Vector< Variant > & getArray() const
Definition Variant.hpp:103
bool BoolType
Definition Variant.hpp:22
BoolType getBoolean() const
Definition Variant.hpp:94
Variant & operator<<=(const Variant &rhs)
Vector< Variant > mArray
Definition Variant.hpp:128
Variant & operator%=(const Variant &rhs)
IntType getInteger() const
Definition Variant.hpp:97
Variant & operator>>=(const Variant &rhs)
Variant arraySub(std::size_t idx) const
Variant & operator+=(const Variant &rhs)
Variant & operator=(const Variant &)=default
Variant & operator=(Variant &&)=default
Variant & operator&=(const Variant &rhs)
bool isArray() const
Definition Variant.hpp:91
Types mType
Definition Variant.hpp:124
Variant & operator^=(const Variant &rhs)
Variant & operator/=(const Variant &rhs)
bool isReal() const
Definition Variant.hpp:88
static Types findCommonType(const Variant &lhs, const Variant &rhs)
Variant(const Variant &)=default
Definition AST.hpp:33
Variant operator%(const Variant &lhs, const Variant &rhs)
Variant operator/(const Variant &lhs, const Variant &rhs)
std::ostream & operator<<(std::ostream &lhs, const BasicTokenString< TokenType, TokenOfInterestFunctor > &rhs)
Definition TokenString.hpp:164
bool operator!=(const Identifier &lhs, const Identifier &rhs)
Definition Identifier.hpp:64
Variant operator*(const Variant &lhs, const Variant &rhs)
Variant operator|(const Variant &lhs, const Variant &rhs)
bool operator==(const Identifier &lhs, const Identifier &rhs)
Definition Identifier.hpp:60
bool operator>=(const ShaderVersion &lhs, const ShaderVersion &rhs)
bool operator<(const Identifier &lhs, const Identifier &rhs)
Definition Identifier.hpp:68
String operator+(const Identifier &lhs, const Identifier &rhs)
Definition Identifier.hpp:72
bool operator<=(const ShaderVersion &lhs, const ShaderVersion &rhs)
Variant operator&(const Variant &lhs, const Variant &rhs)
Variant operator>>(const Variant &lhs, const Variant &rhs)
Variant operator-(const Variant &lhs, const Variant &rhs)
bool operator>(const ShaderVersion &lhs, const ShaderVersion &rhs)
Variant operator^(const Variant &lhs, const Variant &rhs)
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
std::int32_t Int32
Definition DataTypes.hpp:21
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25