xref: /aosp_15_r20/external/perfetto/include/perfetto/protozero/field_writer.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/message.h"
18*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/proto_utils.h"
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #ifndef INCLUDE_PERFETTO_PROTOZERO_FIELD_WRITER_H_
21*6dbdd20aSAndroid Build Coastguard Worker #define INCLUDE_PERFETTO_PROTOZERO_FIELD_WRITER_H_
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker namespace protozero {
24*6dbdd20aSAndroid Build Coastguard Worker namespace internal {
25*6dbdd20aSAndroid Build Coastguard Worker 
26*6dbdd20aSAndroid Build Coastguard Worker template <proto_utils::ProtoSchemaType proto_schema_type>
27*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter {
28*6dbdd20aSAndroid Build Coastguard Worker   static_assert(proto_schema_type != proto_utils::ProtoSchemaType::kMessage,
29*6dbdd20aSAndroid Build Coastguard Worker                 "FieldWriter can't be used with nested messages");
30*6dbdd20aSAndroid Build Coastguard Worker };
31*6dbdd20aSAndroid Build Coastguard Worker 
32*6dbdd20aSAndroid Build Coastguard Worker template <>
33*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kDouble> {
34*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message, uint32_t field_id, double value) {
35*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
36*6dbdd20aSAndroid Build Coastguard Worker   }
37*6dbdd20aSAndroid Build Coastguard Worker };
38*6dbdd20aSAndroid Build Coastguard Worker 
39*6dbdd20aSAndroid Build Coastguard Worker template <>
40*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kFloat> {
41*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message, uint32_t field_id, float value) {
42*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
43*6dbdd20aSAndroid Build Coastguard Worker   }
44*6dbdd20aSAndroid Build Coastguard Worker };
45*6dbdd20aSAndroid Build Coastguard Worker 
46*6dbdd20aSAndroid Build Coastguard Worker template <>
47*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kBool> {
48*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message, uint32_t field_id, bool value) {
49*6dbdd20aSAndroid Build Coastguard Worker     message.AppendTinyVarInt(field_id, value);
50*6dbdd20aSAndroid Build Coastguard Worker   }
51*6dbdd20aSAndroid Build Coastguard Worker };
52*6dbdd20aSAndroid Build Coastguard Worker 
53*6dbdd20aSAndroid Build Coastguard Worker template <>
54*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kInt32> {
55*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
56*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
57*6dbdd20aSAndroid Build Coastguard Worker                             int32_t value) {
58*6dbdd20aSAndroid Build Coastguard Worker     message.AppendVarInt(field_id, value);
59*6dbdd20aSAndroid Build Coastguard Worker   }
60*6dbdd20aSAndroid Build Coastguard Worker };
61*6dbdd20aSAndroid Build Coastguard Worker 
62*6dbdd20aSAndroid Build Coastguard Worker template <>
63*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kInt64> {
64*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
65*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
66*6dbdd20aSAndroid Build Coastguard Worker                             int64_t value) {
67*6dbdd20aSAndroid Build Coastguard Worker     message.AppendVarInt(field_id, value);
68*6dbdd20aSAndroid Build Coastguard Worker   }
69*6dbdd20aSAndroid Build Coastguard Worker };
70*6dbdd20aSAndroid Build Coastguard Worker 
71*6dbdd20aSAndroid Build Coastguard Worker template <>
72*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kUint32> {
73*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
74*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
75*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t value) {
76*6dbdd20aSAndroid Build Coastguard Worker     message.AppendVarInt(field_id, value);
77*6dbdd20aSAndroid Build Coastguard Worker   }
78*6dbdd20aSAndroid Build Coastguard Worker };
79*6dbdd20aSAndroid Build Coastguard Worker 
80*6dbdd20aSAndroid Build Coastguard Worker template <>
81*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kUint64> {
82*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
83*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
84*6dbdd20aSAndroid Build Coastguard Worker                             uint64_t value) {
85*6dbdd20aSAndroid Build Coastguard Worker     message.AppendVarInt(field_id, value);
86*6dbdd20aSAndroid Build Coastguard Worker   }
87*6dbdd20aSAndroid Build Coastguard Worker };
88*6dbdd20aSAndroid Build Coastguard Worker 
89*6dbdd20aSAndroid Build Coastguard Worker template <>
90*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kSint32> {
91*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
92*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
93*6dbdd20aSAndroid Build Coastguard Worker                             int32_t value) {
94*6dbdd20aSAndroid Build Coastguard Worker     message.AppendSignedVarInt(field_id, value);
95*6dbdd20aSAndroid Build Coastguard Worker   }
96*6dbdd20aSAndroid Build Coastguard Worker };
97*6dbdd20aSAndroid Build Coastguard Worker 
98*6dbdd20aSAndroid Build Coastguard Worker template <>
99*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kSint64> {
100*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
101*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
102*6dbdd20aSAndroid Build Coastguard Worker                             int64_t value) {
103*6dbdd20aSAndroid Build Coastguard Worker     message.AppendSignedVarInt(field_id, value);
104*6dbdd20aSAndroid Build Coastguard Worker   }
105*6dbdd20aSAndroid Build Coastguard Worker };
106*6dbdd20aSAndroid Build Coastguard Worker 
107*6dbdd20aSAndroid Build Coastguard Worker template <>
108*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kFixed32> {
109*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
110*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
111*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t value) {
112*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
113*6dbdd20aSAndroid Build Coastguard Worker   }
114*6dbdd20aSAndroid Build Coastguard Worker };
115*6dbdd20aSAndroid Build Coastguard Worker 
116*6dbdd20aSAndroid Build Coastguard Worker template <>
117*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kFixed64> {
118*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
119*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
120*6dbdd20aSAndroid Build Coastguard Worker                             uint64_t value) {
121*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
122*6dbdd20aSAndroid Build Coastguard Worker   }
123*6dbdd20aSAndroid Build Coastguard Worker };
124*6dbdd20aSAndroid Build Coastguard Worker 
125*6dbdd20aSAndroid Build Coastguard Worker template <>
126*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kSfixed32> {
127*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
128*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
129*6dbdd20aSAndroid Build Coastguard Worker                             int32_t value) {
130*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
131*6dbdd20aSAndroid Build Coastguard Worker   }
132*6dbdd20aSAndroid Build Coastguard Worker };
133*6dbdd20aSAndroid Build Coastguard Worker 
134*6dbdd20aSAndroid Build Coastguard Worker template <>
135*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kSfixed64> {
136*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
137*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
138*6dbdd20aSAndroid Build Coastguard Worker                             int64_t value) {
139*6dbdd20aSAndroid Build Coastguard Worker     message.AppendFixed(field_id, value);
140*6dbdd20aSAndroid Build Coastguard Worker   }
141*6dbdd20aSAndroid Build Coastguard Worker };
142*6dbdd20aSAndroid Build Coastguard Worker 
143*6dbdd20aSAndroid Build Coastguard Worker template <>
144*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kEnum> {
145*6dbdd20aSAndroid Build Coastguard Worker   template <typename EnumType>
146*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
147*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
148*6dbdd20aSAndroid Build Coastguard Worker                             EnumType value) {
149*6dbdd20aSAndroid Build Coastguard Worker     message.AppendVarInt(field_id, value);
150*6dbdd20aSAndroid Build Coastguard Worker   }
151*6dbdd20aSAndroid Build Coastguard Worker };
152*6dbdd20aSAndroid Build Coastguard Worker 
153*6dbdd20aSAndroid Build Coastguard Worker template <>
154*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kString> {
155*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
156*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
157*6dbdd20aSAndroid Build Coastguard Worker                             const char* data,
158*6dbdd20aSAndroid Build Coastguard Worker                             size_t size) {
159*6dbdd20aSAndroid Build Coastguard Worker     message.AppendBytes(field_id, data, size);
160*6dbdd20aSAndroid Build Coastguard Worker   }
161*6dbdd20aSAndroid Build Coastguard Worker 
162*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
163*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
164*6dbdd20aSAndroid Build Coastguard Worker                             const std::string& value) {
165*6dbdd20aSAndroid Build Coastguard Worker     message.AppendBytes(field_id, value.data(), value.size());
166*6dbdd20aSAndroid Build Coastguard Worker   }
167*6dbdd20aSAndroid Build Coastguard Worker };
168*6dbdd20aSAndroid Build Coastguard Worker 
169*6dbdd20aSAndroid Build Coastguard Worker template <>
170*6dbdd20aSAndroid Build Coastguard Worker struct FieldWriter<proto_utils::ProtoSchemaType::kBytes> {
171*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
172*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
173*6dbdd20aSAndroid Build Coastguard Worker                             const uint8_t* data,
174*6dbdd20aSAndroid Build Coastguard Worker                             size_t size) {
175*6dbdd20aSAndroid Build Coastguard Worker     message.AppendBytes(field_id, data, size);
176*6dbdd20aSAndroid Build Coastguard Worker   }
177*6dbdd20aSAndroid Build Coastguard Worker 
178*6dbdd20aSAndroid Build Coastguard Worker   inline static void Append(Message& message,
179*6dbdd20aSAndroid Build Coastguard Worker                             uint32_t field_id,
180*6dbdd20aSAndroid Build Coastguard Worker                             const std::string& value) {
181*6dbdd20aSAndroid Build Coastguard Worker     message.AppendBytes(field_id, value.data(), value.size());
182*6dbdd20aSAndroid Build Coastguard Worker   }
183*6dbdd20aSAndroid Build Coastguard Worker };
184*6dbdd20aSAndroid Build Coastguard Worker 
185*6dbdd20aSAndroid Build Coastguard Worker }  // namespace internal
186*6dbdd20aSAndroid Build Coastguard Worker }  // namespace protozero
187*6dbdd20aSAndroid Build Coastguard Worker 
188*6dbdd20aSAndroid Build Coastguard Worker #endif  // INCLUDE_PERFETTO_PROTOZERO_FIELD_WRITER_H_
189