ComIn 0.5.2
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
19#include <algorithm>
20
22 bool lmodexclusive) {
23 if (auto it = comin_var_request_find(&var_desc); it) {
24 if (it->lmodexclusive) {
25 // Another plugin has allocated this variable exclusively.
26 comin_error_set(COMIN_ERROR_VAR_REQUEST_EXISTS_IS_LMODEXCLUSIVE);
27 return;
28 } else if (lmodexclusive) {
29 // This plugin wants exclusive access but the variable already exists
30 comin_error_set(COMIN_ERROR_VAR_REQUEST_EXISTS_REQUEST_LMODEXCLUSIVE);
31 return;
32 } else {
33 // Variable exists but is not exclusive. Just record the plugin as new
34 // user.
35 it->moduleID.push_back(comin_current_get_plugin_id());
36 }
37 } else {
38 auto& var_request_list = comin::state.comin_var_request_list;
39
40 t_comin_request_item req;
41 req.descriptor = var_desc;
42 req.lmodexclusive = lmodexclusive;
43 req.moduleID.push_back(comin_current_get_plugin_id());
44 var_request_list.push_back(std::move(req));
45 }
46}
47
48extern "C" {
49
54 bool lmodexclusive) {
56 comin_error_set(COMIN_ERROR_VAR_REQUEST_AFTER_PRIMARYCONSTRUCTOR);
57 return;
58 }
59
60 if (var_desc.id == -1) {
61 t_comin_var_descriptor dom_desc = var_desc;
62
63 for (int dom = 1; dom <= comin_descrdata_get_global_n_dom(); ++dom) {
64 dom_desc.id = dom;
65
66 var_request_add_element(dom_desc, lmodexclusive);
67 }
68 } else {
69 var_request_add_element(var_desc, lmodexclusive);
70 }
71 }
72
73 t_comin_request_item*
75 auto& var_request_list = comin::state.comin_var_request_list;
76
77 auto it = std::find_if(var_request_list.begin(), var_request_list.end(),
78 [&](const t_comin_request_item& a) {
79 return a.descriptor == *var_desc;
80 });
81
82 if (it != var_request_list.end())
83 return &*it;
84 else
85 return nullptr;
86 }
87
88 comin::keyval::Map*
89 comin_var_request_get_metadata(t_comin_request_item* req) {
90 return &req->metadata;
91 }
92
94 comin_var_request_get_descriptor(t_comin_request_item* req) {
95 return &req->descriptor;
96 }
97
98 t_comin_var_request_list_iterator* comin_request_list_iterator_begin() {
99 auto& var_request_list = comin::state.comin_var_request_list;
100
101 return new t_comin_var_request_list_iterator{var_request_list.begin()};
102 }
103
105 const t_comin_var_request_list_iterator* it) {
106 auto& var_request_list = comin::state.comin_var_request_list;
107
108 return it->it == var_request_list.end();
109 }
110
111 t_comin_request_item*
112 comin_request_list_iterator_next(t_comin_var_request_list_iterator* it) {
113 auto& current = *it->it;
114 ++it->it;
115 return &current;
116 }
117
118 void
119 comin_request_list_iterator_delete(t_comin_var_request_list_iterator** it) {
120 delete *it;
121 *it = nullptr;
122 }
123}
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.