#include "stream_proto_utils.h" namespace android { namespace stream_proto { /** * Position of the field type in a (long long) fieldId. */ const uint64_t FIELD_TYPE_SHIFT = 32; // // FieldId flags for whether the field is single, repeated or packed. // TODO: packed is not supported yet. // const uint64_t FIELD_COUNT_SHIFT = 40; const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT; const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT; const uint64_t FIELD_COUNT_PACKED = 5ULL << FIELD_COUNT_SHIFT; uint64_t get_field_id(const FieldDescriptorProto& field) { // Number uint64_t result = (uint32_t)field.number(); // Type result |= (uint64_t)field.type() << FIELD_TYPE_SHIFT; // Count if (field.options().packed()) { result |= FIELD_COUNT_PACKED; } else if (field.label() == FieldDescriptorProto::LABEL_REPEATED) { result |= FIELD_COUNT_REPEATED; } else { result |= FIELD_COUNT_SINGLE; } return result; } string get_proto_type(const FieldDescriptorProto& field) { switch (field.type()) { case FieldDescriptorProto::TYPE_DOUBLE: return "double"; case FieldDescriptorProto::TYPE_FLOAT: return "float"; case FieldDescriptorProto::TYPE_INT64: return "int64"; case FieldDescriptorProto::TYPE_UINT64: return "uint64"; case FieldDescriptorProto::TYPE_INT32: return "int32"; case FieldDescriptorProto::TYPE_FIXED64: return "fixed64"; case FieldDescriptorProto::TYPE_FIXED32: return "fixed32"; case FieldDescriptorProto::TYPE_BOOL: return "bool"; case FieldDescriptorProto::TYPE_STRING: return "string"; case FieldDescriptorProto::TYPE_GROUP: return "group<unsupported!>"; case FieldDescriptorProto::TYPE_MESSAGE: return field.type_name(); case FieldDescriptorProto::TYPE_BYTES: return "bytes"; case FieldDescriptorProto::TYPE_UINT32: return "uint32"; case FieldDescriptorProto::TYPE_ENUM: return field.type_name(); case FieldDescriptorProto::TYPE_SFIXED32: return "sfixed32"; case FieldDescriptorProto::TYPE_SFIXED64: return "sfixed64"; case FieldDescriptorProto::TYPE_SINT32: return "sint32"; case FieldDescriptorProto::TYPE_SINT64: return "sint64"; default: // won't happen return "void"; } } bool should_generate_for_file(const CodeGeneratorRequest& request, const string& file) { const int N = request.file_to_generate_size(); for (int i=0; i<N; i++) { if (request.file_to_generate(i) == file) { return true; } } return false; } } // stream_proto } // android