ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin_variable.cpp
Go to the documentation of this file.
1
12
13#include "comin_variable.hpp"
14#include "comin.h"
15#include "comin_state.hpp"
16
17#include <algorithm>
18#include <cstring>
19
20extern inline bool operator==(const t_comin_var_descriptor& a,
21 const t_comin_var_descriptor& b);
22
23extern "C" {
24
25 // Check if a variable is used in any context
27 using comin::state;
28
29 auto match_descr = [&](const t_comin_var_context& i) {
30 return i.var_item->descriptor == *descr;
31 };
32
33 // for a given (entry point, plugin_id) pair, check if any variable matches
34 auto find_context = [&](const auto& v) {
35 return std::any_of(v.second.begin(), v.second.end(), match_descr);
36 };
37
38 // loop over all (entry point, plugin_id) pairs
39 return std::any_of(state.comin_var_list_context.begin(),
40 state.comin_var_list_context.end(), find_context);
41 }
42
43 // append variable item to context list (ie. the list of variable accesses for
44 // each entry point).
45 void comin_var_list_context_append(t_comin_entry_point ep, int plugin_id,
46 t_comin_var_item* var_item,
47 int access_flag) {
48 t_comin_var_context item;
49 item.var_item = var_item;
50 item.access_flag = access_flag;
51
52 auto& context = comin::state.comin_var_list_context[{ep, plugin_id}];
53 bool found = std::any_of(
54 context.begin(), context.end(), [&](t_comin_var_context& i) {
55 return i.var_item->descriptor == item.var_item->descriptor;
56 });
57 if (!found)
58 context.push_back(item);
59 }
60
61 t_comin_var_descr_list_iterator* comin_var_get_descr_list_head() {
62 auto& var_list = comin::state.comin_var_list;
63
64 if (var_list.empty())
65 return nullptr;
66
67 return new t_comin_var_descr_list_iterator{
68 comin::state.comin_var_list.begin()};
69 }
70
72 comin_var_get_descr_list_next(t_comin_var_descr_list_iterator* current) {
73 auto& var_list = comin::state.comin_var_list;
74
75 ++current->it;
76
77 if (current->it == var_list.end())
78 return nullptr;
79 else
80 return current;
81 }
82
83 void
84 comin_var_descr_list_iterator_delete(t_comin_var_descr_list_iterator** it) {
85 delete *it;
86 *it = nullptr;
87 }
88
89 void
90 comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator* current,
91 t_comin_var_descriptor* var_desc) {
92 *var_desc = current->it->first;
93 }
94
95 comin::keyval::Map* comin_construct_metadata() {
96 return new comin::keyval::Map{};
97 }
98
99 void comin_destruct_metadata(comin::keyval::Map* metadata) {
100 delete metadata;
101 }
102}
C interface for the ICON Community Interface.
void comin_var_descr_list_iterator_delete(t_comin_var_descr_list_iterator **it)
void comin_var_get_descr_list_var_desc(t_comin_var_descr_list_iterator *current, t_comin_var_descriptor *var_desc)
t_comin_var_descr_list_iterator * comin_var_get_descr_list_head()
bool comin_var_is_used(const t_comin_var_descriptor *descr)
void comin_destruct_metadata(comin::keyval::Map *metadata)
comin::keyval::Map * comin_construct_metadata()
void comin_var_list_context_append(t_comin_entry_point ep, int plugin_id, t_comin_var_item *var_item, int access_flag)
t_comin_var_descr_list_iterator * comin_var_get_descr_list_next(t_comin_var_descr_list_iterator *current)
bool operator==(const t_comin_var_descriptor &a, const t_comin_var_descriptor &b)
struct t_comin_var_descr_list_iterator t_comin_var_descr_list_iterator
Definition comin.h:45
t_comin_var_descriptor descr