69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
#include "ikarus/values/value.h"
|
|
|
|
#include <fmt/format.h>
|
|
|
|
#include <cppbase/templates.hpp>
|
|
|
|
#include <values/number_value.hpp>
|
|
#include <values/text_value.hpp>
|
|
#include <values/toggle_value.hpp>
|
|
#include <values/value.hpp>
|
|
|
|
bool ikarus_value_is_indeterminate(IkarusValue const * value) {
|
|
return value->is_interminate();
|
|
}
|
|
|
|
void ikarus_value_set_indeterminate(IkarusValue * value, bool indeterminate) {
|
|
value->set_intermediate(indeterminate);
|
|
}
|
|
|
|
char const * ikarus_value_to_string(IkarusValue const * value) {
|
|
auto const str = std::visit(
|
|
cppbase::overloaded{
|
|
[](IkarusToggleValue const * toggle_value) -> std::string { return toggle_value->value ? "true" : "false"; },
|
|
[](IkarusNumberValue const * number_value) -> std::string { return fmt::format("{}", number_value->value); },
|
|
[](IkarusTextValue const * text_value) -> std::string { return fmt::format("{}", text_value->value); },
|
|
},
|
|
value->get_data()
|
|
);
|
|
|
|
auto * const ret = new char[str.size() + 1];
|
|
|
|
std::strncpy(ret, str.data(), str.size() + 1);
|
|
|
|
return ret;
|
|
}
|
|
|
|
void ikarus_value_visit(
|
|
IkarusValue * value,
|
|
void (*toggle_visitor)(IkarusToggleValue *, void *),
|
|
void (*number_visitor)(IkarusNumberValue *, void *),
|
|
void (*text_visitor)(IkarusTextValue *, void *),
|
|
void * data
|
|
) {
|
|
std::visit(
|
|
cppbase::overloaded{
|
|
[toggle_visitor, data](IkarusToggleValue * toggle_value) { toggle_visitor(toggle_value, data); },
|
|
[number_visitor, data](IkarusNumberValue * number_value) { number_visitor(number_value, data); },
|
|
[text_visitor, data](IkarusTextValue * text_value) { text_visitor(text_value, data); },
|
|
},
|
|
value->get_data()
|
|
);
|
|
}
|
|
|
|
void ikarus_value_visit_const(
|
|
IkarusValue const * value,
|
|
void (*toggle_visitor)(IkarusToggleValue const *, void *),
|
|
void (*number_visitor)(IkarusNumberValue const *, void *),
|
|
void (*text_visitor)(IkarusTextValue const *, void *),
|
|
void * data
|
|
) {
|
|
std::visit(
|
|
cppbase::overloaded{
|
|
[toggle_visitor, data](IkarusToggleValue const * toggle_value) { toggle_visitor(toggle_value, data); },
|
|
[number_visitor, data](IkarusNumberValue const * number_value) { number_visitor(number_value, data); },
|
|
[text_visitor, data](IkarusTextValue const * text_value) { text_visitor(text_value, data); },
|
|
},
|
|
value->get_data()
|
|
);
|
|
}
|