1 /**
2 * Copyright (c) 2022 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 #include "annotationProto.h"
17
18 namespace panda::proto {
Serialize(const panda::pandasm::AnnotationData & anno,protoPanda::AnnotationData & protoAnno)19 void AnnotationData::Serialize(const panda::pandasm::AnnotationData &anno, protoPanda::AnnotationData &protoAnno)
20 {
21 protoAnno.set_recordname(anno.GetName());
22 for (const auto &element : anno.GetElements()) {
23 auto *protoElement = protoAnno.add_elements();
24 AnnotationElement::Serialize(element, *protoElement);
25 }
26 }
27
Deserialize(const protoPanda::AnnotationData & protoAnno,panda::pandasm::AnnotationData & anno,panda::ArenaAllocator * allocator)28 void AnnotationData::Deserialize(const protoPanda::AnnotationData &protoAnno, panda::pandasm::AnnotationData &anno,
29 panda::ArenaAllocator *allocator)
30 {
31 for (const auto &protoElement : protoAnno.elements()) {
32 panda::pandasm::AnnotationElement &element = AnnotationElement::Deserialize(protoElement, allocator);
33 anno.AddElement(std::move(element));
34 }
35 }
36
Serialize(const panda::pandasm::AnnotationElement & element,protoPanda::AnnotationElement & protoElement)37 void AnnotationElement::Serialize(const panda::pandasm::AnnotationElement &element,
38 protoPanda::AnnotationElement &protoElement)
39 {
40 protoElement.set_name(element.GetName());
41 if (element.GetValue()->IsArray()) {
42 protoElement.set_valuetype(protoPanda::AnnotationElement_ValueType::AnnotationElement_ValueType_ARRAY);
43 auto *protoArray = protoElement.mutable_array();
44 ArrayValue::Serialize(*(element.GetValue()->GetAsArray()), *protoArray);
45 } else {
46 protoElement.set_valuetype(protoPanda::AnnotationElement_ValueType::AnnotationElement_ValueType_SCALAR);
47 auto *protoScalar = protoElement.mutable_scalar();
48 ScalarValue::Serialize(*(element.GetValue()->GetAsScalar()), *protoScalar);
49 }
50 }
51
Deserialize(const protoPanda::AnnotationElement & protoElement,panda::ArenaAllocator * allocator)52 panda::pandasm::AnnotationElement &AnnotationElement::Deserialize(const protoPanda::AnnotationElement &protoElement,
53 panda::ArenaAllocator *allocator)
54 {
55 if (protoElement.valuetype() == protoPanda::AnnotationElement_ValueType::AnnotationElement_ValueType_ARRAY) {
56 panda::pandasm::ArrayValue &array = ArrayValue::Deserialize(protoElement.array(), allocator);
57 auto *element = allocator->New<panda::pandasm::AnnotationElement>(protoElement.name(),
58 std::make_unique<panda::pandasm::ArrayValue>(array));
59 CHECK_NOT_NULL(element);
60 return *element;
61 }
62 panda::pandasm::ScalarValue scalar = ScalarValue::Deserialize(protoElement.scalar(), allocator);
63 auto *element = allocator->New<panda::pandasm::AnnotationElement>(protoElement.name(),
64 std::make_unique<panda::pandasm::ScalarValue>(scalar));
65 CHECK_NOT_NULL(element);
66 return *element;
67 }
68
Serialize(const panda::pandasm::ScalarValue & scalar,protoPanda::ScalarValue & protoScalar)69 void ScalarValue::Serialize(const panda::pandasm::ScalarValue &scalar, protoPanda::ScalarValue &protoScalar)
70 {
71 const auto &valueType = scalar.GetType();
72 protoScalar.mutable_father()->set_type(static_cast<uint32_t>(valueType));
73 auto type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_UINT64;
74 switch (valueType) {
75 case panda::pandasm::Value::Type::U1:
76 case panda::pandasm::Value::Type::U8:
77 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<uint8_t>()));
78 break;
79 case panda::pandasm::Value::Type::U16:
80 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<uint16_t>()));
81 break;
82 case panda::pandasm::Value::Type::STRING_NULLPTR:
83 case panda::pandasm::Value::Type::U32:
84 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<uint32_t>()));
85 break;
86 case panda::pandasm::Value::Type::U64:
87 protoScalar.set_valueu64(scalar.GetValue<uint64_t>());
88 break;
89 case panda::pandasm::Value::Type::I8:
90 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<int8_t>()));
91 break;
92 case panda::pandasm::Value::Type::I16:
93 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<int16_t>()));
94 break;
95 case panda::pandasm::Value::Type::I32:
96 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<int32_t>()));
97 break;
98 case panda::pandasm::Value::Type::I64:
99 protoScalar.set_valueu64(static_cast<uint64_t>(scalar.GetValue<int64_t>()));
100 break;
101 case panda::pandasm::Value::Type::F32:
102 type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_FLOAT;
103 protoScalar.set_valuefloat(scalar.GetValue<float>());
104 break;
105 case panda::pandasm::Value::Type::F64:
106 type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_DOUBLE;
107 protoScalar.set_valuedouble(scalar.GetValue<double>());
108 break;
109 case panda::pandasm::Value::Type::STRING:
110 case panda::pandasm::Value::Type::METHOD:
111 case panda::pandasm::Value::Type::ENUM:
112 case panda::pandasm::Value::Type::LITERALARRAY:
113 type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_STRING;
114 protoScalar.set_valuestr(scalar.GetValue<std::string>());
115 break;
116 case panda::pandasm::Value::Type::RECORD: {
117 type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_PANDASM_TYPE;
118 auto *protoType = protoScalar.mutable_valuetype();
119 Type::Serialize(scalar.GetValue<panda::pandasm::Type>(), *protoType);
120 break;
121 }
122 case panda::pandasm::Value::Type::ANNOTATION: {
123 type = protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_ANNOTATION_DATA;
124 auto *protoAnno = protoScalar.mutable_valueanno();
125 AnnotationData::Serialize(scalar.GetValue<panda::pandasm::AnnotationData>(), *protoAnno);
126 break;
127 }
128 default:
129 std::cerr << "unknown panda::pandasm::Value::Type" << std::endl;
130 UNREACHABLE();
131 }
132 protoScalar.set_type(type);
133 }
134
Deserialize(const protoPanda::ScalarValue & protoScalar,panda::ArenaAllocator * allocator)135 panda::pandasm::ScalarValue ScalarValue::Deserialize(const protoPanda::ScalarValue &protoScalar,
136 panda::ArenaAllocator *allocator)
137 {
138 protoPanda::ScalarValue_VariantValueType scalarType = protoScalar.type();
139 std::variant<uint64_t, float, double, std::string, panda::pandasm::Type, panda::pandasm::AnnotationData> value;
140 switch (scalarType) {
141 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_UINT64: {
142 value = static_cast<uint64_t>(protoScalar.valueu64());
143 break;
144 }
145 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_FLOAT: {
146 value = static_cast<float>(protoScalar.valuefloat());
147 break;
148 }
149 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_DOUBLE: {
150 value = static_cast<double>(protoScalar.valuedouble());
151 break;
152 }
153 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_STRING: {
154 value = static_cast<std::string>(protoScalar.valuestr());
155 break;
156 }
157 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_PANDASM_TYPE: {
158 value = static_cast<panda::pandasm::Type>(Type::Deserialize(protoScalar.valuetype(), allocator));
159 break;
160 }
161 case protoPanda::ScalarValue_VariantValueType::ScalarValue_VariantValueType_ANNOTATION_DATA: {
162 auto &protoAnnotationData = protoScalar.valueanno();
163 auto *value = allocator->New<panda::pandasm::AnnotationData>(protoAnnotationData.recordname());
164 CHECK_NOT_NULL(value);
165 AnnotationData::Deserialize(protoAnnotationData, *value, allocator);
166 break;
167 }
168 default:
169 UNREACHABLE();
170 }
171 auto scalar = ScalarValue::CreateScalarValue(static_cast<panda::pandasm::Value::Type>(
172 protoScalar.father().type()), value);
173 return scalar;
174 }
175
CreateScalarValue(const panda::pandasm::Value::Type & type,std::variant<uint64_t,float,double,std::string,panda::pandasm::Type,panda::pandasm::AnnotationData> & value)176 panda::pandasm::ScalarValue ScalarValue::CreateScalarValue(const panda::pandasm::Value::Type &type,
177 std::variant<uint64_t, float, double, std::string, panda::pandasm::Type, panda::pandasm::AnnotationData> &value)
178 {
179 switch (type) {
180 case panda::pandasm::Value::Type::U1: {
181 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::U1>(static_cast<uint8_t>(
182 std::get<uint64_t>(value)));
183 }
184 case panda::pandasm::Value::Type::U8: {
185 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::U8>(static_cast<uint8_t>(
186 std::get<uint64_t>(value)));
187 }
188 case panda::pandasm::Value::Type::U16: {
189 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::U16>(static_cast<uint16_t>(
190 std::get<uint64_t>(value)));
191 }
192 case panda::pandasm::Value::Type::STRING_NULLPTR: {
193 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::STRING_NULLPTR>(
194 static_cast<uint32_t>(std::get<uint64_t>(value)));
195 }
196 case panda::pandasm::Value::Type::U32: {
197 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::U32>(static_cast<uint32_t>(
198 std::get<uint64_t>(value)));
199 }
200 case panda::pandasm::Value::Type::U64: {
201 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::U64>(static_cast<uint64_t>(
202 std::get<uint64_t>(value)));
203 }
204 case panda::pandasm::Value::Type::I8: {
205 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::I8>(static_cast<int8_t>(
206 std::get<uint64_t>(value)));
207 }
208 case panda::pandasm::Value::Type::I16: {
209 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::I16>(static_cast<int16_t>(
210 std::get<uint64_t>(value)));
211 }
212 case panda::pandasm::Value::Type::I32: {
213 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::I32>(static_cast<int32_t>(
214 std::get<uint64_t>(value)));
215 }
216 case panda::pandasm::Value::Type::I64: {
217 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::I64>(static_cast<int64_t>(
218 std::get<uint64_t>(value)));
219 }
220 case panda::pandasm::Value::Type::F32: {
221 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::F32>(std::get<float>(value));
222 }
223 case panda::pandasm::Value::Type::F64: {
224 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::F64>(std::get<double>(value));
225 }
226 case panda::pandasm::Value::Type::STRING: {
227 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::STRING>(
228 std::get<std::string>(value));
229 }
230 case panda::pandasm::Value::Type::METHOD: {
231 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::METHOD>(
232 std::get<std::string>(value));
233 }
234 case panda::pandasm::Value::Type::ENUM: {
235 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::ENUM>(std::get<std::string>(value));
236 }
237 case panda::pandasm::Value::Type::RECORD: {
238 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::RECORD>(
239 std::get<panda::pandasm::Type>(value));
240 }
241 case panda::pandasm::Value::Type::ANNOTATION: {
242 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::ANNOTATION>(
243 std::get<panda::pandasm::AnnotationData>(value));
244 }
245 case panda::pandasm::Value::Type::LITERALARRAY: {
246 return panda::pandasm::ScalarValue::Create<panda::pandasm::Value::Type::LITERALARRAY>(
247 std::get<std::string>(value));
248 }
249 default:
250 UNREACHABLE();
251 }
252 }
253
Serialize(const panda::pandasm::ArrayValue & array,protoPanda::ArrayValue & protoArray)254 void ArrayValue::Serialize(const panda::pandasm::ArrayValue &array, protoPanda::ArrayValue &protoArray)
255 {
256 protoArray.mutable_father()->set_type(static_cast<uint32_t>(array.GetType()));
257 protoArray.set_componenttype(static_cast<uint32_t>(array.GetComponentType()));
258 for (const auto &val : array.GetValues()) {
259 auto *protoScalar = protoArray.add_values();
260 ScalarValue::Serialize(val, *protoScalar);
261 }
262 }
263
Deserialize(const protoPanda::ArrayValue & protoArray,panda::ArenaAllocator * allocator)264 panda::pandasm::ArrayValue &ArrayValue::Deserialize(const protoPanda::ArrayValue &protoArray,
265 panda::ArenaAllocator *allocator)
266 {
267 std::vector<panda::pandasm::ScalarValue> values;
268 values.reserve(protoArray.values_size());
269 for (const auto &protoValue : protoArray.values()) {
270 panda::pandasm::ScalarValue scalar = ScalarValue::Deserialize(protoValue, allocator);
271 values.emplace_back(std::move(scalar));
272 }
273 auto *array = allocator->New<panda::pandasm::ArrayValue>(
274 static_cast<panda::pandasm::Value::Type>(protoArray.componenttype()), values);
275 CHECK_NOT_NULL(array);
276 return *array;
277 }
278 } // panda::proto
279