1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef CPP_ABCKIT_CORE_MODULE_IMPL_H
17 #define CPP_ABCKIT_CORE_MODULE_IMPL_H
18
19 #include "module.h"
20 #include "class.h"
21 #include "function.h"
22 #include "annotation_interface.h"
23 #include "namespace.h"
24 #include "import_descriptor.h"
25 #include "export_descriptor.h"
26
27 namespace abckit::core {
28
GetFile()29 inline const File *Module::GetFile() const
30 {
31 return GetResource();
32 }
33
GetTarget()34 inline enum AbckitTarget Module::GetTarget() const
35 {
36 auto tar = GetApiConfig()->cIapi_->moduleGetTarget(GetView());
37 CheckError(GetApiConfig());
38 return tar;
39 }
40
IsExternal()41 inline bool Module::IsExternal() const
42 {
43 auto mod = GetApiConfig()->cIapi_->moduleIsExternal(GetView());
44 CheckError(GetApiConfig());
45 return mod;
46 }
47
GetName()48 inline std::string Module::GetName() const
49 {
50 const ApiConfig *conf = GetApiConfig();
51 AbckitString *cString = conf->cIapi_->moduleGetName(GetView());
52 CheckError(conf);
53 std::string str = conf->cIapi_->abckitStringToString(cString);
54 CheckError(conf);
55 return str;
56 }
57
GetClasses()58 inline std::vector<core::Class> Module::GetClasses() const
59 {
60 std::vector<core::Class> classes;
61
62 GetClassesInner(classes);
63
64 CheckError(GetApiConfig());
65
66 return classes;
67 }
68
GetTopLevelFunctions()69 inline std::vector<core::Function> Module::GetTopLevelFunctions() const
70 {
71 std::vector<core::Function> functions;
72
73 GetTopLevelFunctionsInner(functions);
74
75 CheckError(GetApiConfig());
76
77 return functions;
78 }
79
GetAnnotationInterfaces()80 inline std::vector<core::AnnotationInterface> Module::GetAnnotationInterfaces() const
81 {
82 std::vector<core::AnnotationInterface> ifaces;
83
84 GetAnnotationInterfacesInner(ifaces);
85
86 CheckError(GetApiConfig());
87
88 return ifaces;
89 }
90
GetNamespaces()91 inline std::vector<core::Namespace> Module::GetNamespaces() const
92 {
93 std::vector<core::Namespace> namespaces;
94
95 GetNamespacesInner(namespaces);
96
97 CheckError(GetApiConfig());
98
99 return namespaces;
100 }
101
GetImports()102 inline std::vector<core::ImportDescriptor> Module::GetImports() const
103 {
104 std::vector<core::ImportDescriptor> imports;
105
106 GetImportsInner(imports);
107
108 CheckError(GetApiConfig());
109
110 return imports;
111 }
112
GetExports()113 inline std::vector<core::ExportDescriptor> Module::GetExports() const
114 {
115 std::vector<core::ExportDescriptor> exports;
116
117 GetExportsInner(exports);
118
119 CheckError(GetApiConfig());
120
121 return exports;
122 }
123
124 // CC-OFFNXT(G.FUD.06) perf critical
EnumerateNamespaces(const std::function<bool (core::Namespace)> & cb)125 inline bool Module::EnumerateNamespaces(const std::function<bool(core::Namespace)> &cb) const
126 {
127 Payload<const std::function<bool(core::Namespace)> &> payload {cb, GetApiConfig(), GetResource()};
128
129 auto isNormalExit =
130 GetApiConfig()->cIapi_->moduleEnumerateNamespaces(GetView(), &payload, [](AbckitCoreNamespace *ns, void *data) {
131 const auto &payload = *static_cast<Payload<const std::function<bool(core::Namespace)> &> *>(data);
132 return payload.data(core::Namespace(ns, payload.config, payload.resource));
133 });
134 CheckError(GetApiConfig());
135 return isNormalExit;
136 }
137
EnumerateTopLevelFunctions(const std::function<bool (core::Function)> & cb)138 inline bool Module::EnumerateTopLevelFunctions(const std::function<bool(core::Function)> &cb) const
139 {
140 Payload<const std::function<bool(core::Function)> &> payload {cb, GetApiConfig(), GetResource()};
141
142 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateTopLevelFunctions(
143 GetView(), &payload, [](AbckitCoreFunction *func, void *data) {
144 const auto &payload = *static_cast<Payload<const std::function<bool(core::Function)> &> *>(data);
145 return payload.data(core::Function(func, payload.config, payload.resource));
146 });
147 CheckError(GetApiConfig());
148 return isNormalExit;
149 }
150
EnumerateClasses(const std::function<bool (core::Class)> & cb)151 inline bool Module::EnumerateClasses(const std::function<bool(core::Class)> &cb) const
152 {
153 Payload<const std::function<bool(core::Class)> &> payload {cb, GetApiConfig(), GetResource()};
154
155 auto isNormalExit =
156 GetApiConfig()->cIapi_->moduleEnumerateClasses(GetView(), &payload, [](AbckitCoreClass *klass, void *data) {
157 const auto &payload = *static_cast<Payload<const std::function<bool(core::Class)> &> *>(data);
158 return payload.data(core::Class(klass, payload.config, payload.resource));
159 });
160 CheckError(GetApiConfig());
161 return isNormalExit;
162 }
163
EnumerateImports(const std::function<bool (core::ImportDescriptor)> & cb)164 inline bool Module::EnumerateImports(const std::function<bool(core::ImportDescriptor)> &cb) const
165 {
166 Payload<const std::function<bool(core::ImportDescriptor)> &> payload {cb, GetApiConfig(), GetResource()};
167
168 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateImports(
169 GetView(), &payload, [](AbckitCoreImportDescriptor *func, void *data) {
170 const auto &payload = *static_cast<Payload<const std::function<bool(core::ImportDescriptor)> &> *>(data);
171 return payload.data(core::ImportDescriptor(func, payload.config, payload.resource));
172 });
173 CheckError(GetApiConfig());
174 return isNormalExit;
175 }
176
GetClassesInner(std::vector<core::Class> & classes)177 inline bool Module::GetClassesInner(std::vector<core::Class> &classes) const
178 {
179 Payload<std::vector<core::Class> *> payload {&classes, GetApiConfig(), GetResource()};
180
181 auto isNormalExit =
182 GetApiConfig()->cIapi_->moduleEnumerateClasses(GetView(), &payload, [](AbckitCoreClass *klass, void *data) {
183 const auto &payload = *static_cast<Payload<std::vector<core::Class> *> *>(data);
184 payload.data->push_back(core::Class(klass, payload.config, payload.resource));
185 return true;
186 });
187 return isNormalExit;
188 }
189
GetTopLevelFunctionsInner(std::vector<core::Function> & functions)190 inline bool Module::GetTopLevelFunctionsInner(std::vector<core::Function> &functions) const
191 {
192 Payload<std::vector<core::Function> *> payload {&functions, GetApiConfig(), GetResource()};
193
194 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateTopLevelFunctions(
195 GetView(), &payload, [](AbckitCoreFunction *func, void *data) {
196 const auto &payload = *static_cast<Payload<std::vector<core::Function> *> *>(data);
197 payload.data->push_back(core::Function(func, payload.config, payload.resource));
198 return true;
199 });
200 return isNormalExit;
201 }
202
GetAnnotationInterfacesInner(std::vector<core::AnnotationInterface> & ifaces)203 inline bool Module::GetAnnotationInterfacesInner(std::vector<core::AnnotationInterface> &ifaces) const
204 {
205 Payload<std::vector<core::AnnotationInterface> *> payload {&ifaces, GetApiConfig(), GetResource()};
206
207 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateAnnotationInterfaces(
208 GetView(), &payload, [](AbckitCoreAnnotationInterface *func, void *data) {
209 const auto &payload = *static_cast<Payload<std::vector<core::AnnotationInterface> *> *>(data);
210 payload.data->push_back(core::AnnotationInterface(func, payload.config, payload.resource));
211 return true;
212 });
213 return isNormalExit;
214 }
215
GetNamespacesInner(std::vector<core::Namespace> & namespaces)216 inline bool Module::GetNamespacesInner(std::vector<core::Namespace> &namespaces) const
217 {
218 Payload<std::vector<core::Namespace> *> payload {&namespaces, GetApiConfig(), GetResource()};
219
220 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateNamespaces(
221 GetView(), &payload, [](AbckitCoreNamespace *func, void *data) {
222 const auto &payload = *static_cast<Payload<std::vector<core::Namespace> *> *>(data);
223 payload.data->push_back(core::Namespace(func, payload.config, payload.resource));
224 return true;
225 });
226 return isNormalExit;
227 }
228
GetImportsInner(std::vector<core::ImportDescriptor> & imports)229 inline bool Module::GetImportsInner(std::vector<core::ImportDescriptor> &imports) const
230 {
231 Payload<std::vector<core::ImportDescriptor> *> payload {&imports, GetApiConfig(), GetResource()};
232
233 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateImports(
234 GetView(), &payload, [](AbckitCoreImportDescriptor *func, void *data) {
235 const auto &payload = *static_cast<Payload<std::vector<core::ImportDescriptor> *> *>(data);
236 payload.data->push_back(core::ImportDescriptor(func, payload.config, payload.resource));
237 return true;
238 });
239 return isNormalExit;
240 }
241
GetExportsInner(std::vector<core::ExportDescriptor> & exports)242 inline bool Module::GetExportsInner(std::vector<core::ExportDescriptor> &exports) const
243 {
244 Payload<std::vector<core::ExportDescriptor> *> payload {&exports, GetApiConfig(), GetResource()};
245
246 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateExports(
247 GetView(), &payload, [](AbckitCoreExportDescriptor *func, void *data) {
248 const auto &payload = *static_cast<Payload<std::vector<core::ExportDescriptor> *> *>(data);
249 payload.data->push_back(core::ExportDescriptor(func, payload.config, payload.resource));
250 return true;
251 });
252 return isNormalExit;
253 }
254
EnumerateAnonymousFunctions(const std::function<bool (core::Function)> & cb)255 inline bool Module::EnumerateAnonymousFunctions(const std::function<bool(core::Function)> &cb) const
256 {
257 Payload<const std::function<bool(core::Function)> &> payload {cb, GetApiConfig(), GetResource()};
258
259 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateAnonymousFunctions(
260 GetView(), &payload, [](AbckitCoreFunction *func, void *data) {
261 const auto &payload = *static_cast<Payload<const std::function<bool(core::Function)> &> *>(data);
262 return payload.data(core::Function(func, payload.config, payload.resource));
263 });
264 CheckError(GetApiConfig());
265 return isNormalExit;
266 }
267
EnumerateExports(const std::function<bool (core::ExportDescriptor)> & cb)268 inline bool Module::EnumerateExports(const std::function<bool(core::ExportDescriptor)> &cb) const
269 {
270 Payload<const std::function<bool(core::ExportDescriptor)> &> payload {cb, GetApiConfig(), GetResource()};
271
272 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateExports(
273 GetView(), &payload, [](AbckitCoreExportDescriptor *desc, void *data) {
274 const auto &payload = *static_cast<Payload<const std::function<bool(core::ExportDescriptor)> &> *>(data);
275 return payload.data(core::ExportDescriptor(desc, payload.config, payload.resource));
276 });
277 CheckError(GetApiConfig());
278 return isNormalExit;
279 }
280
EnumerateAnnotationInterfaces(const std::function<bool (core::AnnotationInterface)> & cb)281 inline bool Module::EnumerateAnnotationInterfaces(const std::function<bool(core::AnnotationInterface)> &cb) const
282 {
283 Payload<const std::function<bool(core::AnnotationInterface)> &> payload {cb, GetApiConfig(), GetResource()};
284
285 auto isNormalExit = GetApiConfig()->cIapi_->moduleEnumerateAnnotationInterfaces(
286 GetView(), &payload, [](AbckitCoreAnnotationInterface *desc, void *data) {
287 const auto &payload = *static_cast<Payload<const std::function<bool(core::AnnotationInterface)> &> *>(data);
288 return payload.data(core::AnnotationInterface(desc, payload.config, payload.resource));
289 });
290 CheckError(GetApiConfig());
291 return isNormalExit;
292 }
293
294 } // namespace abckit::core
295
296 #endif // CPP_ABCKIT_CORE_MODULE_IMPL_H
297