SceneSwitcher/src/utils/variable-number.tpp
2023-03-19 03:52:21 -07:00

64 lines
1.6 KiB
C++

template class NumberVariable<int>;
template class NumberVariable<double>;
template<typename T>
inline NumberVariable<T>::NumberVariable(T value) : _value(value)
{
}
template<typename T>
void NumberVariable<T>::Save(obs_data_t *obj, const char *name) const
{
auto data = obs_data_create();
if constexpr (std::is_same<T, int>::value) {
obs_data_set_int(data, "value", _value);
} else if constexpr (std::is_same<T, double>::value) {
obs_data_set_double(data, "value", _value);
} else {
assert(false);
}
auto var = _variable.lock();
if (var) {
obs_data_set_string(data, "variable", var->Name().c_str());
}
obs_data_set_int(data, "type", static_cast<int>(_type));
obs_data_set_obj(obj, name, data);
obs_data_release(data);
}
template<typename T>
void NumberVariable<T>::Load(obs_data_t *obj, const char *name)
{
auto data = obs_data_get_obj(obj, name);
if constexpr (std::is_same<T, int>::value) {
_value = obs_data_get_int(data, "value");
} else if constexpr (std::is_same<T, double>::value) {
_value = obs_data_get_double(data, "value");
} else {
assert(false);
}
auto variableName = obs_data_get_string(data, "variable");
_variable = GetWeakVariableByName(variableName);
_type = static_cast<Type>(obs_data_get_int(data, "type"));
obs_data_release(data);
}
template<typename T> T NumberVariable<T>::GetValue() const
{
if (_type == Type::VARIABLE) {
auto var = _variable.lock();
if (!var) {
return {};
}
auto value = var->DoubleValue();
return value.value_or(0.0);
}
return _value;
}
template<typename T> NumberVariable<T>::operator T() const
{
return GetValue();
}