ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin_keyval.cpp
Go to the documentation of this file.
1// @file comin_keyval.cpp
2// @brief Key value storage backend based on std::unordered_map and std::variant
3//
4// @authors 08/2024 :: ICON Community Interface <comin@icon-model.org>
5//
6// SPDX-License-Identifier: BSD-3-Clause
7//
8// See LICENSES for license information.
9// Where software is supplied by third parties, it is indicated in the
10// headers of the routines.
11
12#include <cstdint>
13#include <iostream>
14#include <memory>
15#include <string>
16#include <string_view>
17#include <unordered_map>
18#include <variant>
19
20#include "comin_hash.hpp"
21#include "comin_keyval.hpp"
22#include "comin_state.hpp"
23#include "comin_variable.hpp"
24
25namespace {
26using MapType = comin::keyval::Map;
27
28t_comin_var_descriptor to_var_descriptor(const char* name, size_t len, int id) {
30 strncpy(descr.name, name, len);
31 descr.name[len] = '\0';
32 descr.id = id;
33
34 return descr;
35}
36} // namespace
37
38extern "C" {
39 void comin_keyval_set_int_c(const char* ckey, int val, MapType* map) {
40 (*map)[ckey] = val;
41 }
42
43 void comin_keyval_get_int_c(const char* ckey, int* val, MapType* map) {
44 *val = std::get<int>(map->at(ckey));
45 }
46
47 void comin_keyval_set_double_c(const char* ckey, double val, MapType* map) {
48 (*map)[ckey] = val;
49 }
50
51 void comin_keyval_get_double_c(const char* ckey, double* val, MapType* map) {
52 *val = std::get<double>(map->at(ckey));
53 }
54
55 void comin_keyval_set_char_c(const char* ckey, char* val, MapType* map) {
56 (*map)[ckey] = std::string(val);
57 }
58
59 void comin_keyval_get_char_c(const char* ckey, const char** val,
60 MapType* map) {
61 *val = std::get<std::string>(map->at(ckey)).data();
62 }
63
64 void comin_keyval_set_bool_c(const char* ckey, bool val, MapType* map) {
65 (*map)[ckey] = val;
66 }
67
68 void comin_keyval_get_bool_c(const char* ckey, bool* val, MapType* map) {
69 *val = std::get<bool>(map->at(ckey));
70 }
71
72 void comin_keyval_create_c(MapType** map) { *map = new MapType(); }
73
74 void comin_keyval_delete_c(MapType* map) { delete map; }
75
76 void comin_keyval_query_c(const char* ckey, int* idx, MapType* map) {
77 auto it = map->find(ckey);
78 if (it == map->end())
79 *idx = -1;
80 else
81 *idx = it->second.index();
82 }
83
84 void comin_keyval_iterator_begin_c(MapType* map, MapType::iterator** it) {
85 *it = new MapType::iterator(map->begin());
86 }
87
88 void comin_keyval_iterator_end_c(MapType* map, MapType::iterator** it) {
89 *it = new MapType::iterator(map->end());
90 }
91
92 const char* comin_keyval_iterator_get_key_c(MapType::iterator* it) {
93 return ((*it)->first).c_str();
94 }
95
96 bool comin_keyval_iterator_compare_c(MapType::iterator* it1,
97 MapType::iterator* it2) {
98 return (*it1 == *it2);
99 }
100
101 void comin_keyval_iterator_next_c(MapType::iterator* it) { (*it)++; }
102
103 void comin_keyval_iterator_delete_c(MapType::iterator* it) { delete it; }
104
105 void comin_varmap_new_c(t_comin_var_map** map) {
106 *map = new t_comin_var_map();
107 }
108 void comin_varmap_delete_c(t_comin_var_map* map) { delete map; }
109 void comin_varmap_clear_c(t_comin_var_map* map) { map->clear(); }
110 const t_comin_var_item* comin_varmap_get_c(const t_comin_var_map* map,
111 const char* name, size_t len,
112 int id) {
113 auto it = map->find(to_var_descriptor(name, len, id));
114 if (it == map->end())
115 return nullptr;
116
117 return it->second.get();
118 }
119
120 void comin_varmap_put_c(t_comin_var_map* map, const char* name, size_t len,
121 int id, const t_comin_var_item* ptr) {
122 // store a copy of the item in the map
123 map->emplace(to_var_descriptor(name, len, id),
124 std::make_unique<t_comin_var_item>(*ptr));
125 }
126
127 void comin_varmap_iterator_begin_c(t_comin_var_map* map,
128 t_comin_var_map::iterator** it) {
129 *it = new t_comin_var_map::iterator(map->begin());
130 }
131
132 void comin_varmap_iterator_delete_c(t_comin_var_map::iterator* it) {
133 delete it;
134 }
135
136 void comin_varmap_iterator_next_c(t_comin_var_map::iterator* it) { ++*it; }
137
138 void comin_varmap_iterator_value_c(const t_comin_var_map::iterator* it,
139 t_comin_var_item const** ptr) {
140 *ptr = (*it)->second.get();
141 }
142
143 bool comin_varmap_iterator_is_end_c(const t_comin_var_map* map,
144 const t_comin_var_map::iterator* it) {
145 return *it == map->end();
146 }
147}
void comin_keyval_set_bool_c(const char *ckey, bool val, MapType *map)
void comin_keyval_iterator_next_c(MapType::iterator *it)
void comin_keyval_iterator_end_c(MapType *map, MapType::iterator **it)
void comin_keyval_get_bool_c(const char *ckey, bool *val, MapType *map)
void comin_keyval_create_c(MapType **map)
void comin_keyval_get_double_c(const char *ckey, double *val, MapType *map)
void comin_varmap_iterator_value_c(const t_comin_var_map::iterator *it, t_comin_var_item const **ptr)
bool comin_varmap_iterator_is_end_c(const t_comin_var_map *map, const t_comin_var_map::iterator *it)
void comin_varmap_delete_c(t_comin_var_map *map)
void comin_keyval_get_char_c(const char *ckey, const char **val, MapType *map)
void comin_keyval_query_c(const char *ckey, int *idx, MapType *map)
const t_comin_var_item * comin_varmap_get_c(const t_comin_var_map *map, const char *name, size_t len, int id)
void comin_keyval_get_int_c(const char *ckey, int *val, MapType *map)
void comin_keyval_iterator_delete_c(MapType::iterator *it)
void comin_varmap_iterator_next_c(t_comin_var_map::iterator *it)
void comin_keyval_iterator_begin_c(MapType *map, MapType::iterator **it)
void comin_varmap_iterator_begin_c(t_comin_var_map *map, t_comin_var_map::iterator **it)
const char * comin_keyval_iterator_get_key_c(MapType::iterator *it)
void comin_keyval_set_int_c(const char *ckey, int val, MapType *map)
void comin_keyval_set_double_c(const char *ckey, double val, MapType *map)
void comin_varmap_new_c(t_comin_var_map **map)
void comin_varmap_iterator_delete_c(t_comin_var_map::iterator *it)
void comin_keyval_set_char_c(const char *ckey, char *val, MapType *map)
void comin_keyval_delete_c(MapType *map)
void comin_varmap_clear_c(t_comin_var_map *map)
void comin_varmap_put_c(t_comin_var_map *map, const char *name, size_t len, int id, const t_comin_var_item *ptr)
bool comin_keyval_iterator_compare_c(MapType::iterator *it1, MapType::iterator *it2)
t_comin_var_descriptor descr