• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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