ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin_var_request.cpp
Go to the documentation of this file.
1
12
13#include "comin.h"
14
15#include "comin_state.hpp"
16#include "comin_var_request.hpp"
17#include "comin_variable.hpp"
18
20 bool lmodexclusive) {
21 if (auto it = comin_var_request_find(&var_desc); it) {
22 if (it->lmodexclusive) {
23 // Another plugin has allocated this variable exclusively.
24 comin_error_set(COMIN_ERROR_VAR_REQUEST_EXISTS_IS_LMODEXCLUSIVE);
25 return;
26 } else if (lmodexclusive) {
27 // This plugin wants exclusive access but the variable already exists
28 comin_error_set(COMIN_ERROR_VAR_REQUEST_EXISTS_REQUEST_LMODEXCLUSIVE);
29 return;
30 } else {
31 // Variable exists but is not exclusive. Just record the plugin as new
32 // user.
33 it->moduleID.push_back(comin_current_get_plugin_id());
34 }
35 } else {
36 auto& var_request_list = comin::state.comin_var_request_list;
37
38 t_comin_request_item req;
39 req.descriptor = var_desc;
40 req.lmodexclusive = lmodexclusive;
41 req.moduleID.push_back(comin_current_get_plugin_id());
42 var_request_list.push_back(std::move(req));
43 }
44}
45
46extern "C" {
47
52 bool lmodexclusive) {
54 comin_error_set(COMIN_ERROR_VAR_REQUEST_AFTER_PRIMARYCONSTRUCTOR);
55 return;
56 }
57
58 if (var_desc.id == -1) {
59 t_comin_var_descriptor dom_desc = var_desc;
60
61 for (int dom = 1; dom <= comin_descrdata_get_global_n_dom(); ++dom) {
62 dom_desc.id = dom;
63
64 var_request_add_element(dom_desc, lmodexclusive);
65 }
66 } else {
67 var_request_add_element(var_desc, lmodexclusive);
68 }
69 }
70
71 t_comin_request_item*
73 auto& var_request_list = comin::state.comin_var_request_list;
74
75 auto it = std::find_if(var_request_list.begin(), var_request_list.end(),
76 [&](const t_comin_request_item& a) {
77 return a.descriptor == *var_desc;
78 });
79
80 if (it != var_request_list.end())
81 return &*it;
82 else
83 return nullptr;
84 }
85
86 comin::keyval::Map*
87 comin_var_request_get_metadata(t_comin_request_item* req) {
88 return &req->metadata;
89 }
90
92 comin_var_request_get_descriptor(t_comin_request_item* req) {
93 return &req->descriptor;
94 }
95
96 t_comin_var_request_list_iterator* comin_request_list_iterator_begin() {
97 auto& var_request_list = comin::state.comin_var_request_list;
98
99 return new t_comin_var_request_list_iterator{var_request_list.begin()};
100 }
101
103 const t_comin_var_request_list_iterator* it) {
104 auto& var_request_list = comin::state.comin_var_request_list;
105
106 return it->it == var_request_list.end();
107 }
108
109 t_comin_request_item*
110 comin_request_list_iterator_next(t_comin_var_request_list_iterator* it) {
111 auto& current = *it->it;
112 ++it->it;
113 return &current;
114 }
115
116 void
117 comin_request_list_iterator_delete(t_comin_var_request_list_iterator** it) {
118 delete *it;
119 *it = nullptr;
120 }
121}
C interface for the ICON Community Interface.
void comin_error_set(t_comin_error_code error_code)
bool comin_state_is_primary_done()
int comin_current_get_plugin_id()
comin::keyval::Map * comin_var_request_get_metadata(t_comin_request_item *req)
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
static void var_request_add_element(const t_comin_var_descriptor &var_desc, bool lmodexclusive)
t_comin_var_request_list_iterator * comin_request_list_iterator_begin()
bool comin_request_list_iterator_is_end(const t_comin_var_request_list_iterator *it)
void comin_request_list_iterator_delete(t_comin_var_request_list_iterator **it)
t_comin_request_item * comin_var_request_find(const t_comin_var_descriptor *var_desc)
t_comin_request_item * comin_request_list_iterator_next(t_comin_var_request_list_iterator *it)
t_comin_var_descriptor * comin_var_request_get_descriptor(t_comin_request_item *req)
int comin_descrdata_get_global_n_dom()
Number of logical domains.