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 ARK_WEB_TYPES_H_
17 #define ARK_WEB_TYPES_H_
18 #pragma once
19
20 #include <list>
21 #include <map>
22 #include <math.h>
23 #include <string>
24 #include <vector>
25
26 #include "base/include/ark_web_macros.h"
27 #include "base/include/ark_web_memory.h"
28 #include "base/include/ark_web_scoped_refptr.h"
29
30 template<class T>
31 using ArkWebRefPtr = ark_web_scoped_refptr<T>;
32
33 typedef struct {
34 int size;
35 char* value;
36
37 ArkWebMemFreeFunc ark_web_mem_free_func;
38 } ArkWebCharVector;
39
40 const ArkWebCharVector ark_web_char_vector_default = {
41 0,
42 };
43
44 typedef struct {
45 int size;
46 uint8_t* value;
47
48 ArkWebMemFreeFunc ark_web_mem_free_func;
49 } ArkWebUint8Vector;
50
51 const ArkWebUint8Vector ark_web_uint8_vector_default = {
52 0,
53 };
54
55 typedef struct {
56 int size;
57 uint16_t* value;
58
59 ArkWebMemFreeFunc ark_web_mem_free_func;
60 } ArkWebUint16Vector;
61
62 const ArkWebUint16Vector ark_web_uint16_vector_default = {
63 0,
64 };
65
66 typedef struct {
67 int size;
68 int32_t* value;
69
70 ArkWebMemFreeFunc ark_web_mem_free_func;
71 } ArkWebInt32Vector;
72
73 const ArkWebInt32Vector ark_web_int32_vector_default = {
74 0,
75 };
76
77 typedef struct {
78 int size;
79 int64_t* value;
80
81 ArkWebMemFreeFunc ark_web_mem_free_func;
82 } ArkWebInt64Vector;
83
84 const ArkWebInt64Vector ark_web_int64_vector_default = {
85 0,
86 };
87
88 typedef struct {
89 int size;
90 uint32_t* value;
91
92 ArkWebMemFreeFunc ark_web_mem_free_func;
93 } ArkWebUint32Vector;
94
95 const ArkWebUint32Vector ark_web_uint32_vector_default = {
96 0,
97 };
98
99 typedef struct {
100 int size;
101 double* value;
102
103 ArkWebMemFreeFunc ark_web_mem_free_func;
104 } ArkWebDoubleVector;
105
106 const ArkWebDoubleVector ark_web_double_vector_default = {
107 0,
108 };
109
110 typedef struct {
111 int size;
112 bool* value;
113
114 ArkWebMemFreeFunc ark_web_mem_free_func;
115 } ArkWebBooleanVector;
116
117 const ArkWebBooleanVector ark_web_boolean_vector_default = {
118 0,
119 };
120
121 typedef struct {
122 int size;
123 int32_t* value;
124
125 ArkWebMemFreeFunc ark_web_mem_free_func;
126 } ArkWebInt32List;
127
128 const ArkWebInt32List ark_web_int32_list_default = {
129 0,
130 };
131
132 typedef struct {
133 int size;
134 char* value;
135
136 ArkWebMemFreeFunc ark_web_mem_free_func;
137 } ArkWebString;
138
139 const ArkWebString ark_web_string_default = {
140 0,
141 };
142
143 typedef struct {
144 int size;
145 char16_t* value;
146
147 ArkWebMemFreeFunc ark_web_mem_free_func;
148 } ArkWebU16String;
149
150 const ArkWebU16String ark_web_u16string_default = {
151 0,
152 };
153
154 typedef struct {
155 int size;
156 ArkWebString* key;
157 ArkWebString* value;
158
159 ArkWebMemFreeFunc ark_web_mem_free_func;
160 } ArkWebStringMap;
161
162 const ArkWebStringMap ark_web_string_map_default = {
163 0,
164 };
165
166 typedef struct {
167 int size;
168 ArkWebString* value;
169
170 ArkWebMemFreeFunc ark_web_mem_free_func;
171 } ArkWebStringList;
172
173 const ArkWebStringList ark_web_string_list_default = {
174 0,
175 };
176
177 typedef struct {
178 int size;
179 ArkWebString* value;
180
181 ArkWebMemFreeFunc ark_web_mem_free_func;
182 } ArkWebStringVector;
183
184 const ArkWebStringVector ark_web_string_vector_default = {
185 0,
186 };
187
188 typedef struct {
189 int size;
190 ArkWebString* key;
191 ArkWebStringVector* value;
192
193 ArkWebMemFreeFunc ark_web_mem_free_func;
194 } ArkWebStringVectorMap;
195
196 const ArkWebStringVectorMap ark_web_string_vector_map_default = {
197 0,
198 };
199
200 typedef struct {
201 int size;
202 ArkWebString* key;
203 ArkWebUint8Vector* value;
204
205 ArkWebMemFreeFunc ark_web_mem_free_func;
206 } ArkWebUInt8VectorMap;
207
208 const ArkWebUInt8VectorMap ark_web_uint8_vector_map_default = {
209 0,
210 };
211
212 template<typename T1, typename T2, typename R>
ArkWebBasicMapClassToStruct(const std::map<T1,T2> & class_value)213 R ArkWebBasicMapClassToStruct(const std::map<T1, T2>& class_value)
214 {
215 R struct_value = { .size = class_value.size(), .ark_web_mem_free_func = ArkWebMemFree };
216 if (struct_value.size > 0) {
217 struct_value.key = (T1*)ArkWebMemMalloc(sizeof(T1) * struct_value.size);
218 struct_value.value = (T2*)ArkWebMemMalloc(sizeof(T2) * struct_value.size);
219 if (struct_value.key == nullptr || struct_value.value == nullptr) {
220 ArkWebMemFree(struct_value.key);
221 ArkWebMemFree(struct_value.value);
222 struct_value.size = 0;
223 return struct_value;
224 }
225
226 int count = 0;
227 for (auto it = class_value.begin(); it != class_value.end(); it++) {
228 struct_value.key[count] = it->first;
229 struct_value.value[count] = it->second;
230 count++;
231 }
232 }
233
234 return struct_value;
235 }
236
237 template<typename T1, typename T2, typename P>
ArkWebBasicMapStructToClass(const P & struct_value)238 std::map<T1, T2> ArkWebBasicMapStructToClass(const P& struct_value)
239 {
240 std::map<T1, T2> class_value;
241 if (struct_value.size > 0) {
242 for (int count = 0; count < struct_value.size; count++) {
243 class_value.insert(std::map<T1, T2>::value_type(struct_value.key[count], struct_value.value[count]));
244 }
245 }
246
247 return class_value;
248 }
249
250 template<typename P>
ArkWebBasicMapStructRelease(P & struct_value)251 ARK_WEB_NO_SANITIZE void ArkWebBasicMapStructRelease(P& struct_value)
252 {
253 struct_value.size = 0;
254 SAFE_FREE(struct_value.key, struct_value.ark_web_mem_free_func);
255 SAFE_FREE(struct_value.value, struct_value.ark_web_mem_free_func);
256 }
257
258 template<typename T, typename R>
ArkWebBasicListClassToStruct(const std::list<T> & class_value)259 R ArkWebBasicListClassToStruct(const std::list<T>& class_value)
260 {
261 R struct_value = { .size = class_value.size(), .ark_web_mem_free_func = ArkWebMemFree };
262 if (struct_value.size > 0) {
263 struct_value.value = (T*)ArkWebMemMalloc(sizeof(T) * struct_value.size);
264 if (struct_value.value == nullptr) {
265 struct_value.size = 0;
266 return struct_value;
267 }
268
269 int count = 0;
270 for (auto it = class_value.begin(); it != class_value.end(); it++) {
271 struct_value.value[count] = *it;
272 count++;
273 }
274 }
275
276 return struct_value;
277 }
278
279 template<typename T, typename P>
ArkWebBasicListStructToClass(const P & struct_value)280 std::list<T> ArkWebBasicListStructToClass(const P& struct_value)
281 {
282 std::list<T> class_value;
283 if (struct_value.size > 0) {
284 for (int count = 0; count < struct_value.size; count++) {
285 class_value.push_back(struct_value.value[count]);
286 }
287 }
288
289 return class_value;
290 }
291
292 template<typename P>
ArkWebBasicListStructRelease(P & struct_value)293 ARK_WEB_NO_SANITIZE void ArkWebBasicListStructRelease(P& struct_value)
294 {
295 struct_value.size = 0;
296 SAFE_FREE(struct_value.value, struct_value.ark_web_mem_free_func);
297 }
298
299 template<typename T, typename R>
ArkWebBasicVectorClassToStruct(const std::vector<T> & class_value)300 R ArkWebBasicVectorClassToStruct(const std::vector<T>& class_value)
301 {
302 R struct_value = { .size = class_value.size(), .ark_web_mem_free_func = ArkWebMemFree };
303 if (struct_value.size > 0) {
304 struct_value.value = (T*)ArkWebMemMalloc(sizeof(T) * struct_value.size);
305 if (struct_value.value == nullptr) {
306 struct_value.size = 0;
307 return struct_value;
308 }
309
310 int count = 0;
311 for (auto it = class_value.begin(); it != class_value.end(); it++) {
312 struct_value.value[count] = *it;
313 count++;
314 }
315 }
316
317 return struct_value;
318 }
319
320 template<typename T, typename P>
ArkWebBasicVectorStructToClass(const P & struct_value)321 std::vector<T> ArkWebBasicVectorStructToClass(const P& struct_value)
322 {
323 std::vector<T> class_value;
324 if (struct_value.size > 0) {
325 for (int count = 0; count < struct_value.size; count++) {
326 class_value.push_back(struct_value.value[count]);
327 }
328 }
329
330 return class_value;
331 }
332
333 template<typename P>
ArkWebBasicVectorStructRelease(P & struct_value)334 ARK_WEB_NO_SANITIZE void ArkWebBasicVectorStructRelease(P& struct_value)
335 {
336 struct_value.size = 0;
337 SAFE_FREE(struct_value.value, struct_value.ark_web_mem_free_func);
338 }
339
340 ArkWebString ArkWebStringClassToStruct(const std::string& class_value);
341
342 std::string ArkWebStringStructToClass(const ArkWebString& struct_value);
343
344 ArkWebU16String ArkWebU16StringClassToStruct(const std::u16string& class_value);
345
346 std::u16string ArkWebU16StringStructToClass(const ArkWebU16String& struct_value);
347
348 void ArkWebStringStructRelease(ArkWebString& struct_value);
349
350 void ArkWebU16StringStructRelease(ArkWebU16String& struct_value);
351
352 ArkWebStringMap ArkWebStringMapClassToStruct(const std::map<std::string, std::string>& class_value);
353
354 std::map<std::string, std::string> ArkWebStringMapStructToClass(const ArkWebStringMap& struct_value);
355
356 void ArkWebStringMapStructRelease(ArkWebStringMap& struct_value);
357
358 ArkWebStringList ArkWebStringListClassToStruct(const std::list<std::string>& class_value);
359
360 std::list<std::string> ArkWebStringListStructToClass(const ArkWebStringList& struct_value);
361
362 void ArkWebStringListStructRelease(ArkWebStringList& struct_value);
363
364 ArkWebStringVector ArkWebStringVectorClassToStruct(const std::vector<std::string>& class_value);
365
366 std::vector<std::string> ArkWebStringVectorStructToClass(const ArkWebStringVector& struct_value);
367
368 void ArkWebStringVectorStructRelease(ArkWebStringVector& struct_value);
369
370 ArkWebStringVectorMap ArkWebStringVectorMapClassToStruct(
371 const std::map<std::string, std::vector<std::string>>& class_value);
372
373 std::map<std::string, std::vector<std::string>> ArkWebStringVectorMapStructToClass(
374 const ArkWebStringVectorMap& struct_value);
375
376 void ArkWebStringVectorMapStructRelease(ArkWebStringVectorMap& struct_value);
377
378 ArkWebUInt8VectorMap ArkWebUInt8VectorMapClassToStruct(
379 const std::map<std::string, std::vector<uint8_t>>& class_value);
380
381 std::map<std::string, std::vector<uint8_t>> ArkWebUInt8VectorMapStructToClass(
382 const ArkWebUInt8VectorMap& struct_value);
383
384 void ArkWebUInt8VectorMapStructRelease(ArkWebUInt8VectorMap& struct_value);
385
386 #endif // ARK_WEB_TYPES_H_