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_FUNCTION_IMPL_H
17 #define CPP_ABCKIT_CORE_FUNCTION_IMPL_H
18
19 #include "function.h"
20 #include "class.h"
21 #include "module.h"
22 #include "../config.h"
23 #include "../graph.h"
24
25 namespace abckit::core {
26
CreateGraph()27 inline Graph Function::CreateGraph() const
28 {
29 const ApiConfig *conf = GetApiConfig();
30 AbckitGraph *graph = conf->cIapi_->createGraphFromFunction(GetView());
31 CheckError(conf);
32 return Graph(graph, conf_, GetResource());
33 }
34
SetGraph(const Graph & graph)35 inline Function Function::SetGraph(const Graph &graph) const
36 {
37 const ApiConfig *conf = GetApiConfig();
38 conf->cMapi_->functionSetGraph(GetView(), graph.GetResource());
39 CheckError(conf);
40 return *this;
41 }
42
GetFile()43 inline const File *Function::GetFile() const
44 {
45 return GetResource();
46 }
47
GetName()48 inline std::string Function::GetName() const
49 {
50 const ApiConfig *conf = GetApiConfig();
51 AbckitString *cString = conf->cIapi_->functionGetName(GetView());
52 CheckError(conf);
53 std::string str = conf->cIapi_->abckitStringToString(cString);
54 CheckError(conf);
55 return str;
56 }
57
58 // CC-OFFNXT(G.FUD.06) perf critical
GetAnnotations()59 inline std::vector<core::Annotation> Function::GetAnnotations() const
60 {
61 std::vector<core::Annotation> anns;
62
63 Payload<std::vector<core::Annotation> *> payload {&anns, GetApiConfig(), GetResource()};
64
65 GetApiConfig()->cIapi_->functionEnumerateAnnotations(
66 GetView(), &payload, [](AbckitCoreAnnotation *ann, void *data) {
67 const auto &payload = *static_cast<Payload<std::vector<core::Annotation> *> *>(data);
68 payload.data->push_back(core::Annotation(ann, payload.config, payload.resource));
69 return true;
70 });
71
72 CheckError(GetApiConfig());
73
74 return anns;
75 }
76
IsStatic()77 inline bool Function::IsStatic() const
78 {
79 const ApiConfig *conf = GetApiConfig();
80 bool result = conf->cIapi_->functionIsStatic(GetView());
81 CheckError(conf);
82 return result;
83 }
84
GetModule()85 inline core::Module Function::GetModule() const
86 {
87 const ApiConfig *conf = GetApiConfig();
88 AbckitCoreModule *module = conf->cIapi_->functionGetModule(GetView());
89 CheckError(conf);
90 return core::Module(module, conf_, GetResource());
91 }
92
GetParentClass()93 inline core::Class Function::GetParentClass() const
94 {
95 const ApiConfig *conf = GetApiConfig();
96 AbckitCoreClass *klass = conf->cIapi_->functionGetParentClass(GetView());
97 CheckError(conf);
98 return core::Class(klass, conf_, GetResource());
99 }
100
101 // CC-OFFNXT(G.FUD.06) perf critical
EnumerateNestedFunctions(const std::function<bool (core::Function)> & cb)102 inline bool Function::EnumerateNestedFunctions(const std::function<bool(core::Function)> &cb) const
103 {
104 Payload<const std::function<bool(core::Function)> &> payload {cb, GetApiConfig(), GetResource()};
105
106 bool isNormalExit = GetApiConfig()->cIapi_->functionEnumerateNestedFunctions(
107 GetView(), &payload, [](AbckitCoreFunction *nestedFunc, void *data) {
108 const auto &payload = *static_cast<Payload<const std::function<bool(core::Function)> &> *>(data);
109 return payload.data(core::Function(nestedFunc, payload.config, payload.resource));
110 });
111 CheckError(GetApiConfig());
112 return isNormalExit;
113 }
114
115 // CC-OFFNXT(G.FUD.06) perf critical
EnumerateNestedClasses(const std::function<bool (core::Class)> & cb)116 inline bool Function::EnumerateNestedClasses(const std::function<bool(core::Class)> &cb) const
117 {
118 Payload<const std::function<bool(core::Class)> &> payload {cb, GetApiConfig(), GetResource()};
119
120 bool isNormalExit = GetApiConfig()->cIapi_->functionEnumerateNestedClasses(
121 GetView(), &payload, [](AbckitCoreClass *nestedClass, void *data) {
122 const auto &payload = *static_cast<Payload<const std::function<bool(core::Class)> &> *>(data);
123 return payload.data(core::Class(nestedClass, payload.config, payload.resource));
124 });
125 CheckError(GetApiConfig());
126 return isNormalExit;
127 }
128
GetParentFunction()129 inline Function Function::GetParentFunction() const
130 {
131 auto *func = GetApiConfig()->cIapi_->functionGetParentFunction(GetView());
132 CheckError(GetApiConfig());
133 return Function(func, GetApiConfig(), GetResource());
134 }
135
GetParentNamespace()136 inline core::Namespace Function::GetParentNamespace() const
137 {
138 auto *ns = GetApiConfig()->cIapi_->functionGetParentNamespace(GetView());
139 CheckError(GetApiConfig());
140 return Namespace(ns, GetApiConfig(), GetResource());
141 }
142
EnumerateAnnotations(const std::function<bool (core::Annotation)> & cb)143 inline bool Function::EnumerateAnnotations(const std::function<bool(core::Annotation)> &cb) const
144 {
145 Payload<const std::function<bool(core::Annotation)> &> payload {cb, GetApiConfig(), GetResource()};
146
147 bool isNormalExit = GetApiConfig()->cIapi_->functionEnumerateAnnotations(
148 GetView(), &payload, [](AbckitCoreAnnotation *anno, void *data) {
149 const auto &payload = *static_cast<Payload<const std::function<bool(core::Annotation)> &> *>(data);
150 return payload.data(core::Annotation(anno, payload.config, payload.resource));
151 });
152 CheckError(GetApiConfig());
153 return isNormalExit;
154 }
155
IsCtor()156 inline bool Function::IsCtor() const
157 {
158 auto isCtor = GetApiConfig()->cIapi_->functionIsCtor(GetView());
159 CheckError(GetApiConfig());
160 return isCtor;
161 }
162
IsAnonymous()163 inline bool Function::IsAnonymous() const
164 {
165 auto isAnonymous = GetApiConfig()->cIapi_->functionIsAnonymous(GetView());
166 CheckError(GetApiConfig());
167 return isAnonymous;
168 }
169
SetGraph(Graph & graph)170 inline Function Function::SetGraph(Graph &graph) const
171 {
172 GetApiConfig()->cMapi_->functionSetGraph(GetView(), graph.GetResource());
173 CheckError(GetApiConfig());
174 return *this;
175 }
176
177 } // namespace abckit::core
178
179 #endif // CPP_ABCKIT_CORE_FUNCTION_IMPL_H
180