blob: fb2d98d45b0e85bb4794cb9a838dcefc53032297 [file] [log] [blame]
Yi Jinf9ed04b2017-10-20 16:17:58 -07001#include "stream_proto_utils.h"
2
3namespace android {
4namespace stream_proto {
5
6/**
7 * Position of the field type in a (long long) fieldId.
8 */
9const uint64_t FIELD_TYPE_SHIFT = 32;
10
11//
12// FieldId flags for whether the field is single, repeated or packed.
13// TODO: packed is not supported yet.
14//
15const uint64_t FIELD_COUNT_SHIFT = 40;
Yi Jinf9ed04b2017-10-20 16:17:58 -070016const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT;
17const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT;
18const uint64_t FIELD_COUNT_PACKED = 5ULL << FIELD_COUNT_SHIFT;
19
20uint64_t
21get_field_id(const FieldDescriptorProto& field)
22{
23 // Number
24 uint64_t result = (uint32_t)field.number();
25
26 // Type
27 result |= (uint64_t)field.type() << FIELD_TYPE_SHIFT;
28
29 // Count
30 if (field.options().packed()) {
31 result |= FIELD_COUNT_PACKED;
32 } else if (field.label() == FieldDescriptorProto::LABEL_REPEATED) {
33 result |= FIELD_COUNT_REPEATED;
34 } else {
35 result |= FIELD_COUNT_SINGLE;
36 }
37
38 return result;
39}
40
41string
42get_proto_type(const FieldDescriptorProto& field)
43{
44 switch (field.type()) {
45 case FieldDescriptorProto::TYPE_DOUBLE:
46 return "double";
47 case FieldDescriptorProto::TYPE_FLOAT:
48 return "float";
49 case FieldDescriptorProto::TYPE_INT64:
50 return "int64";
51 case FieldDescriptorProto::TYPE_UINT64:
52 return "uint64";
53 case FieldDescriptorProto::TYPE_INT32:
54 return "int32";
55 case FieldDescriptorProto::TYPE_FIXED64:
56 return "fixed64";
57 case FieldDescriptorProto::TYPE_FIXED32:
58 return "fixed32";
59 case FieldDescriptorProto::TYPE_BOOL:
60 return "bool";
61 case FieldDescriptorProto::TYPE_STRING:
62 return "string";
63 case FieldDescriptorProto::TYPE_GROUP:
64 return "group<unsupported!>";
65 case FieldDescriptorProto::TYPE_MESSAGE:
66 return field.type_name();
67 case FieldDescriptorProto::TYPE_BYTES:
68 return "bytes";
69 case FieldDescriptorProto::TYPE_UINT32:
70 return "uint32";
71 case FieldDescriptorProto::TYPE_ENUM:
72 return field.type_name();
73 case FieldDescriptorProto::TYPE_SFIXED32:
74 return "sfixed32";
75 case FieldDescriptorProto::TYPE_SFIXED64:
76 return "sfixed64";
77 case FieldDescriptorProto::TYPE_SINT32:
78 return "sint32";
79 case FieldDescriptorProto::TYPE_SINT64:
80 return "sint64";
81 default:
82 // won't happen
83 return "void";
84 }
85}
86
87bool
88should_generate_for_file(const CodeGeneratorRequest& request, const string& file)
89{
90 const int N = request.file_to_generate_size();
91 for (int i=0; i<N; i++) {
92 if (request.file_to_generate(i) == file) {
93 return true;
94 }
95 }
96 return false;
97}
98
99} // stream_proto
100} // android