Cogs.Core
ValueVariant.cpp
1#include "ValueVariant.h"
2
3#include "Foundation/Logging/Logger.h"
4
5#include <glm/gtc/type_ptr.hpp>
6
7#include "Parsing.h"
8
9namespace
10{
11 Cogs::Logging::Log logger = Cogs::Logging::getLogger("ValueVariant");
12}
13
14Cogs::Core::ValueVariant::ValueVariant( const ValueVariant& original) : stringValue( original.stringValue ){
15 type = original.type;
16 memcpy(static_cast<void*>(&float4x4Value), &original.float4x4Value, sizeof(float4x4Value));
17}
18
19bool Cogs::Core::ValueVariant::isNumericType(ParsedDataType type) const
20{
21 return type == ParsedDataType::Float ||
22 type == ParsedDataType::Double ||
23 type == ParsedDataType::Int;
24}
25
26float Cogs::Core::ValueVariant::getFloat(float defaultValue) const
27{
28 switch (type) {
29 case ParsedDataType::Float:
30 return floatValue;
31 default:
32 return static_cast<float>(getDouble(defaultValue));
33 }
34}
35
36double Cogs::Core::ValueVariant::getDouble(double defaultValue) const
37{
38 switch (type) {
39 case ParsedDataType::Bool:
40 return boolValue ? 1 : 0;
41 case ParsedDataType::Int:
42 return static_cast<double>(intValue);
43 case ParsedDataType::Float:
44 return floatValue;
45 case ParsedDataType::Double:
46 return doubleValue;
47 case ParsedDataType::String:
48 return parseDouble(stringValue, defaultValue);
49 case ParsedDataType::Unknown:
50 return defaultValue;
51 default:
52 LOG_WARNING(logger, "Invalid implicit conversion from type %d to numeric.", static_cast<int>(type));
53 return defaultValue;
54 }
55}
56
57bool Cogs::Core::ValueVariant::getBool(bool defaultValue) const
58{
59 switch (type) {
60 case ParsedDataType::Bool:
61 return boolValue;
62 case ParsedDataType::Int:
63 return intValue > 0;
64 case ParsedDataType::String:
65 return parseBool(stringValue, defaultValue);
66 case ParsedDataType::Unknown:
67 return defaultValue;
68 default:
69 LOG_WARNING(logger, "Invalid implicit conversion from type %d to numeric.", static_cast<int>(type));
70 return defaultValue;
71 }
72}
73
74int Cogs::Core::ValueVariant::getInt(int defaultValue) const
75{
76 switch (type) {
77 case ParsedDataType::Bool:
78 return boolValue ? 1 : 0;
79 case ParsedDataType::Int:
80 return intValue;
81 case ParsedDataType::Float:
82 return (int)floatValue;
83 case ParsedDataType::Double:
84 return (int)doubleValue;
85 case ParsedDataType::String:
86 return parseInt(stringValue, defaultValue);
87 case ParsedDataType::Unknown:
88 return defaultValue;
89 default:
90 LOG_WARNING(logger, "Invalid implicit conversion from type %d to int.", static_cast<int>(type));
91 return defaultValue;
92 }
93}
94
95glm::vec2 Cogs::Core::ValueVariant::getVec2(glm::vec2 defaultValue) const
96{
97 switch (type) {
98 case ParsedDataType::Float2:
99 return float2Value;
100 case ParsedDataType::Float3:
101 return glm::vec2(float3Value);
102 case ParsedDataType::Float4:
103 return glm::vec2(float4Value);
104 case ParsedDataType::String:
105 {
106 glm::vec2 value = {};
107 auto tokens = split(stringValue, ",[](){}");
108
109 parseValues(glm::value_ptr(value), tokens, 2);
110
111 return value;
112 }
113 default:
114 return defaultValue;
115 }
116}
117
118glm::vec3 Cogs::Core::ValueVariant::getVec3(glm::vec3 defaultValue) const
119{
120 switch (type) {
121 case ParsedDataType::Float3:
122 return float3Value;
123 case ParsedDataType::Float4:
124 return glm::vec3(float4Value);
125 case ParsedDataType::String:
126 {
127 glm::vec3 value = {};
128 auto tokens = split(stringValue, ",[](){}");
129
130 parseValues(glm::value_ptr(value), tokens, 3);
131
132 return value;
133 }
134 default:
135 return defaultValue;
136 }
137}
138
139glm::vec4 Cogs::Core::ValueVariant::getVec4(glm::vec4 defaultValue) const
140{
141 switch (type) {
142 case ParsedDataType::Float3:
143 return glm::vec4(float3Value, 1);
144 case ParsedDataType::Float4:
145 return float4Value;
146 case ParsedDataType::String:
147 {
148 glm::vec4 value = defaultValue;
149 auto tokens = split(stringValue, ",[](){}");
150
151 parseValues(glm::value_ptr(value), tokens, 4);
152
153 return value;
154 }
155 default:
156 return defaultValue;
157 }
158}
159
160Cogs::StringView Cogs::Core::ValueVariant::getString(StringView defaultValue) const
161{
162 return type == ParsedDataType::String ? stringValue : defaultValue;
163}
164
165Cogs::Core::ValueVariant& Cogs::Core::ValueVariant::operator =( const ValueVariant& rhs) {
166 type = rhs.type;
167 stringValue = rhs.stringValue;
168
169 switch (type) {
170 case ParsedDataType::Float: floatValue = rhs.floatValue; break;
171 case ParsedDataType::Float2: float2Value = rhs.float2Value; break;
172 case ParsedDataType::Float3: float3Value = rhs.float3Value; break;
173 case ParsedDataType::Float4: float4Value = rhs.float4Value; break;
174 case ParsedDataType::Float4x4: float4x4Value = rhs.float4x4Value; break;
175 case ParsedDataType::Int: intValue = rhs.intValue; break;
176 case ParsedDataType::Int2: int2Value = rhs.int2Value; break;
177 case ParsedDataType::Int3: int3Value = rhs.int3Value; break;
178 case ParsedDataType::Int4: int4Value = rhs.int4Value; break;
179 case ParsedDataType::UInt: uintValue = rhs.uintValue; break;
180 case ParsedDataType::UInt2: uint2Value = rhs.uint2Value; break;
181 case ParsedDataType::UInt3: uint3Value = rhs.uint3Value; break;
182 case ParsedDataType::UInt4: uint4Value = rhs.uint4Value; break;
183 case ParsedDataType::Bool: boolValue = rhs.boolValue; break;
184 case ParsedDataType::Double: doubleValue = rhs.doubleValue; break;
185 default: break;
186 }
187 return *this;
188}
Log implementation class.
Definition: LogManager.h:139
Provides a weakly referenced view over the contents of a string.
Definition: StringView.h:24
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180