fixup compiler errors & finalize json (de-)serialization for values

Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
folling 2023-12-09 14:02:05 +01:00 committed by Folling
parent 7f24d3d064
commit e22bfba991
Signed by: folling
SSH key fingerprint: SHA256:S9qEx5WCFFLK49tE/LKnKuJYM5sw+++Dn6qJbbyxnCY
13 changed files with 116 additions and 58 deletions

View file

@ -1,8 +1,19 @@
#pragma once
#include <concepts>
#include <ranges>
#include <boost/bind/bind.hpp>
#include <boost/container/small_vector.hpp>
#include <boost/functional/overloaded_function.hpp>
template<typename V>
typename V::data_type const * ikarus_value_base_get(V * value, size_t idx) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
return &(*data)[idx];
}
@ -11,7 +22,11 @@ typename V::data_type const * ikarus_value_base_get(V * value, size_t idx) {
template<typename V>
size_t ikarus_value_base_get_size(V const * value) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
return data->size();
}
@ -20,28 +35,44 @@ size_t ikarus_value_base_get_size(V const * value) {
template<typename V>
void ikarus_value_base_set(V * value, size_t idx, typename V::data_type new_data) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
(*data)[idx] = new_data;
}
}
template<typename V>
void ikarus_value_base_remove(V * value, size_t idx) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
data->erase(data->begin() + idx);
}
}
template<typename V>
void ikarus_value_base_insert(V * value, size_t idx, typename V::data_type new_data) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
data->insert(data->begin() + idx, new_data);
}
}
template<typename V>
void ikarus_value_base_clear(V * value) {
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
if (auto * data =
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
&value->data
);
data != nullptr) {
data->clear();
}
}
@ -56,10 +87,32 @@ void ikarus_value_base_set_undefined(V * value, bool undefined) {
if (undefined) {
value->data = boost::variant2::monostate{};
} else {
value->data = typename V::data_type{};
value->data = boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>{};
}
}
template<typename V, std::invocable<typename V::data_type> F>
char const * ikarus_value_base_to_string(V const * value, F transformer) {
return boost::variant2::visit(
boost::make_overloaded_function(
[](boost::variant2::monostate const&) -> char const * { return nullptr; },
[&transformer](boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE> const& data
) -> char const * {
auto buffer = fmt::memory_buffer{};
fmt::format_to(
std::back_inserter(buffer),
"{}",
fmt::join(data | std::views::transform(std::forward<F>(transformer)), ", ")
);
return buffer.data();
}
),
value->data
);
}
template<typename V>
bool ikarus_value_base_is_equal(V const * lhs, V const * rhs) {
return lhs->data == rhs->data;