blob: e8f86bc0be83f1943da06fd5b20360e0ab7fbf46 [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;
16const uint64_t FIELD_COUNT_MASK = 0x0fULL << FIELD_COUNT_SHIFT;
17const uint64_t FIELD_COUNT_UNKNOWN = 0;
18const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT;
19const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT;
20const uint64_t FIELD_COUNT_PACKED = 5ULL << FIELD_COUNT_SHIFT;
21
22uint64_t
23get_field_id(const FieldDescriptorProto& field)
24{
25 // Number
26 uint64_t result = (uint32_t)field.number();
27
28 // Type
29 result |= (uint64_t)field.type() << FIELD_TYPE_SHIFT;
30
31 // Count
32 if (field.options().packed()) {
33 result |= FIELD_COUNT_PACKED;
34 } else if (field.label() == FieldDescriptorProto::LABEL_REPEATED) {
35 result |= FIELD_COUNT_REPEATED;
36 } else {
37 result |= FIELD_COUNT_SINGLE;
38 }
39
40 return result;
41}
42
43string
44get_proto_type(const FieldDescriptorProto& field)
45{
46 switch (field.type()) {
47 case FieldDescriptorProto::TYPE_DOUBLE:
48 return "double";
49 case FieldDescriptorProto::TYPE_FLOAT:
50 return "float";
51 case FieldDescriptorProto::TYPE_INT64:
52 return "int64";
53 case FieldDescriptorProto::TYPE_UINT64:
54 return "uint64";
55 case FieldDescriptorProto::TYPE_INT32:
56 return "int32";
57 case FieldDescriptorProto::TYPE_FIXED64:
58 return "fixed64";
59 case FieldDescriptorProto::TYPE_FIXED32:
60 return "fixed32";
61 case FieldDescriptorProto::TYPE_BOOL:
62 return "bool";
63 case FieldDescriptorProto::TYPE_STRING:
64 return "string";
65 case FieldDescriptorProto::TYPE_GROUP:
66 return "group<unsupported!>";
67 case FieldDescriptorProto::TYPE_MESSAGE:
68 return field.type_name();
69 case FieldDescriptorProto::TYPE_BYTES:
70 return "bytes";
71 case FieldDescriptorProto::TYPE_UINT32:
72 return "uint32";
73 case FieldDescriptorProto::TYPE_ENUM:
74 return field.type_name();
75 case FieldDescriptorProto::TYPE_SFIXED32:
76 return "sfixed32";
77 case FieldDescriptorProto::TYPE_SFIXED64:
78 return "sfixed64";
79 case FieldDescriptorProto::TYPE_SINT32:
80 return "sint32";
81 case FieldDescriptorProto::TYPE_SINT64:
82 return "sint64";
83 default:
84 // won't happen
85 return "void";
86 }
87}
88
89bool
90should_generate_for_file(const CodeGeneratorRequest& request, const string& file)
91{
92 const int N = request.file_to_generate_size();
93 for (int i=0; i<N; i++) {
94 if (request.file_to_generate(i) == file) {
95 return true;
96 }
97 }
98 return false;
99}
100
101} // stream_proto
102} // android