implement value.hpp

Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
folling 2023-12-03 11:41:06 +01:00 committed by Folling
parent 3395eba331
commit 5d91c89533
Signed by: folling
SSH key fingerprint: SHA256:S9qEx5WCFFLK49tE/LKnKuJYM5sw+++Dn6qJbbyxnCY
6 changed files with 93 additions and 96 deletions

View file

@ -2,31 +2,41 @@
template<typename V>
typename V::data_type const * ikarus_value_base_get(V * value, size_t idx) {
if (value->is_indeterminate()) {
return nullptr;
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
return &(*data)[idx];
}
return &value->value[idx];
return nullptr;
}
template<typename V>
size_t ikarus_value_base_get_size(V const * value) {
return value->value.size();
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
return data->size();
}
return 0;
}
template<typename V>
void ikarus_value_base_set(V * value, size_t idx, typename V::data_type new_data) {
value->value[idx] = new_data;
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
(*data)[idx] = new_data;
}
}
template<typename V>
void ikarus_value_base_remove(V * value, size_t idx) {
value->value.erase(value->value.begin() + idx);
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); 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) {
value->value.insert(value->value.begin() + idx, new_data);
if (auto * data = value->data.template get_if<std::vector<typename V::data_type>>(); data != nullptr) {
data->insert(data->begin() + idx, new_data);
}
}
template<typename V>