Added option to add custom types ScriptValue.

This commit is contained in:
Patrick 2024-07-31 22:18:51 +02:00
parent cdcf99237b
commit 2942149cb5

View File

@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include "../container/optional.hpp" #include "../container/optional.hpp"
#include "../util/traits.hpp"
namespace mijin namespace mijin
{ {
@ -17,9 +18,14 @@ namespace mijin
// public types // public types
// //
template<typename TConcrete, typename... TAdditional>
class ScriptValue;
template<typename TScriptValue>
struct ArrayValue struct ArrayValue
{ {
std::vector<class ScriptValue> values; std::vector<TScriptValue> values;
bool operator==(const ArrayValue& other) const; bool operator==(const ArrayValue& other) const;
inline bool operator!=(const ArrayValue& other) const { inline bool operator!=(const ArrayValue& other) const {
@ -37,19 +43,27 @@ inline constexpr UndefinedValue UNDEFINED_VALUE;
using script_int_t = long long; using script_int_t = long long;
using script_float_t = double; using script_float_t = double;
template<typename TConcrete, typename... TAdditional>
using script_value_base_t = std::variant< using script_value_base_t = std::variant<
UndefinedValue, UndefinedValue,
bool, bool,
script_int_t, script_int_t,
script_float_t, script_float_t,
std::string, std::string,
ArrayValue ArrayValue<TConcrete>,
TAdditional...
>; >;
template<typename TConcrete, typename... TAdditional>
class ScriptValue class ScriptValue
{ {
public:
using base_t = script_value_base_t<TConcrete, TAdditional...>;
using concrete_t = TConcrete;
using array_t = ArrayValue<TConcrete>;
private: private:
script_value_base_t base_; base_t base_;
public: public:
ScriptValue() noexcept = default; ScriptValue() noexcept = default;
ScriptValue(const ScriptValue&) noexcept = default; ScriptValue(const ScriptValue&) noexcept = default;
@ -83,7 +97,7 @@ public:
return visit([&](auto&& value) -> Optional<script_int_t> return visit([&](auto&& value) -> Optional<script_int_t>
{ {
using type_t = std::decay_t<decltype(value)>; using type_t = std::decay_t<decltype(value)>;
if constexpr (std::is_same_v<type_t, bool> || std::is_same_v<type_t, script_int_t> || std::is_same_v<type_t, script_float_t>) if constexpr (std::is_arithmetic_v<type_t>)
{ {
return static_cast<script_int_t>(value); return static_cast<script_int_t>(value);
} }
@ -110,7 +124,7 @@ public:
return visit([&](auto&& value) -> Optional<script_float_t> return visit([&](auto&& value) -> Optional<script_float_t>
{ {
using type_t = std::decay_t<decltype(value)>; using type_t = std::decay_t<decltype(value)>;
if constexpr (std::is_same_v<type_t, bool> || std::is_same_v<type_t, script_int_t> || std::is_same_v<type_t, script_float_t>) if constexpr (std::is_arithmetic_v<type_t>)
{ {
return static_cast<script_float_t>(value); return static_cast<script_float_t>(value);
} }
@ -185,9 +199,17 @@ public:
{ {
return toString(); return toString();
} }
else if constexpr (std::is_same_v<type_t, ScriptValue>) else if constexpr (std::is_same_v<type_t, TConcrete>)
{ {
return *this; return *static_cast<copy_cv_t<std::remove_reference_t<decltype(*this)>, TConcrete>*>(this);
}
else if constexpr (is_any_type_v<T, TAdditional...>)
{
if (std::holds_alternative<T>(base_))
{
return std::get<T>(base_);
}
return NULL_OPTIONAL;
} }
else else
{ {
@ -199,8 +221,9 @@ public:
// //
// public functions // public functions
// //
template<typename TConcrete, typename... TAdditional>
template<typename TValue> template<typename TValue>
ScriptValue::ScriptValue(TValue&& value) : base_(std::forward<TValue>(value)) ScriptValue<TConcrete, TAdditional...>::ScriptValue(TValue&& value) : base_(std::forward<TValue>(value))
{ {
} }
} // namespace mijin } // namespace mijin