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