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