diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index 9ee17adbfd5d1..52529bb0b39f7 100644 --- a/src/google/protobuf/descriptor.cc +++ b/src/google/protobuf/descriptor.cc @@ -690,6 +690,22 @@ Descriptor::WellKnownType FindWellKnownType(absl::string_view name) { } // namespace +FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { + ABSL_CHECK(type >= 0 && type <= MAX_TYPE) << "Invalid input value."; + return kTypeToCppTypeMap[type]; +} + +absl::string_view FieldDescriptor::TypeName(Type type) { + ABSL_CHECK(type >= 0 && type <= MAX_TYPE) << "Invalid input value."; + return kTypeToName[type]; +} + +absl::string_view FieldDescriptor::CppTypeName(CppType cpp_type) { + ABSL_CHECK(cpp_type >= 0 && cpp_type <= MAX_CPPTYPE) + << "Invalid input value."; + return kCppTypeToName[cpp_type]; +} + const FieldDescriptor::CppType FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = { static_cast(0), // 0 is reserved for errors diff --git a/src/google/protobuf/descriptor.h b/src/google/protobuf/descriptor.h index d097038033863..25c3c5d3a4299 100644 --- a/src/google/protobuf/descriptor.h +++ b/src/google/protobuf/descriptor.h @@ -3212,18 +3212,6 @@ inline absl::string_view FieldDescriptor::cpp_type_name() const { return kCppTypeToName[kTypeToCppTypeMap[type()]]; } -inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { - return kTypeToCppTypeMap[type]; -} - -inline absl::string_view FieldDescriptor::TypeName(Type type) { - return kTypeToName[type]; -} - -inline absl::string_view FieldDescriptor::CppTypeName(CppType cpp_type) { - return kCppTypeToName[cpp_type]; -} - inline bool FieldDescriptor::IsTypePackable(Type field_type) { return (field_type != FieldDescriptor::TYPE_STRING && field_type != FieldDescriptor::TYPE_GROUP && diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc index 472ae944cdb3e..87282b8923a12 100644 --- a/src/google/protobuf/descriptor_unittest.cc +++ b/src/google/protobuf/descriptor_unittest.cc @@ -3159,24 +3159,28 @@ TEST_F(MiscTest, StaticTypeNames) { typedef FieldDescriptor FD; // avoid ugly line wrapping - EXPECT_EQ(absl::string_view("double"), FD::TypeName(FD::TYPE_DOUBLE)); - EXPECT_EQ(absl::string_view("float"), FD::TypeName(FD::TYPE_FLOAT)); - EXPECT_EQ(absl::string_view("int64"), FD::TypeName(FD::TYPE_INT64)); - EXPECT_EQ(absl::string_view("uint64"), FD::TypeName(FD::TYPE_UINT64)); - EXPECT_EQ(absl::string_view("int32"), FD::TypeName(FD::TYPE_INT32)); - EXPECT_EQ(absl::string_view("fixed64"), FD::TypeName(FD::TYPE_FIXED64)); - EXPECT_EQ(absl::string_view("fixed32"), FD::TypeName(FD::TYPE_FIXED32)); - EXPECT_EQ(absl::string_view("bool"), FD::TypeName(FD::TYPE_BOOL)); - EXPECT_EQ(absl::string_view("string"), FD::TypeName(FD::TYPE_STRING)); - EXPECT_EQ(absl::string_view("group"), FD::TypeName(FD::TYPE_GROUP)); - EXPECT_EQ(absl::string_view("message"), FD::TypeName(FD::TYPE_MESSAGE)); - EXPECT_EQ(absl::string_view("bytes"), FD::TypeName(FD::TYPE_BYTES)); - EXPECT_EQ(absl::string_view("uint32"), FD::TypeName(FD::TYPE_UINT32)); - EXPECT_EQ(absl::string_view("enum"), FD::TypeName(FD::TYPE_ENUM)); - EXPECT_EQ(absl::string_view("sfixed32"), FD::TypeName(FD::TYPE_SFIXED32)); - EXPECT_EQ(absl::string_view("sfixed64"), FD::TypeName(FD::TYPE_SFIXED64)); - EXPECT_EQ(absl::string_view("sint32"), FD::TypeName(FD::TYPE_SINT32)); - EXPECT_EQ(absl::string_view("sint64"), FD::TypeName(FD::TYPE_SINT64)); + EXPECT_EQ("ERROR", FD::TypeName(FD::Type{})); + EXPECT_EQ("double", FD::TypeName(FD::TYPE_DOUBLE)); + EXPECT_EQ("float", FD::TypeName(FD::TYPE_FLOAT)); + EXPECT_EQ("int64", FD::TypeName(FD::TYPE_INT64)); + EXPECT_EQ("uint64", FD::TypeName(FD::TYPE_UINT64)); + EXPECT_EQ("int32", FD::TypeName(FD::TYPE_INT32)); + EXPECT_EQ("fixed64", FD::TypeName(FD::TYPE_FIXED64)); + EXPECT_EQ("fixed32", FD::TypeName(FD::TYPE_FIXED32)); + EXPECT_EQ("bool", FD::TypeName(FD::TYPE_BOOL)); + EXPECT_EQ("string", FD::TypeName(FD::TYPE_STRING)); + EXPECT_EQ("group", FD::TypeName(FD::TYPE_GROUP)); + EXPECT_EQ("message", FD::TypeName(FD::TYPE_MESSAGE)); + EXPECT_EQ("bytes", FD::TypeName(FD::TYPE_BYTES)); + EXPECT_EQ("uint32", FD::TypeName(FD::TYPE_UINT32)); + EXPECT_EQ("enum", FD::TypeName(FD::TYPE_ENUM)); + EXPECT_EQ("sfixed32", FD::TypeName(FD::TYPE_SFIXED32)); + EXPECT_EQ("sfixed64", FD::TypeName(FD::TYPE_SFIXED64)); + EXPECT_EQ("sint32", FD::TypeName(FD::TYPE_SINT32)); + EXPECT_EQ("sint64", FD::TypeName(FD::TYPE_SINT64)); + + EXPECT_DEATH((void)FD::TypeName(static_cast(FD::MAX_TYPE + 1)), + "Invalid input value"); } TEST_F(MiscTest, CppTypes) { @@ -3252,16 +3256,48 @@ TEST_F(MiscTest, StaticCppTypeNames) { typedef FieldDescriptor FD; // avoid ugly line wrapping - EXPECT_EQ(absl::string_view("int32"), FD::CppTypeName(FD::CPPTYPE_INT32)); - EXPECT_EQ(absl::string_view("int64"), FD::CppTypeName(FD::CPPTYPE_INT64)); - EXPECT_EQ(absl::string_view("uint32"), FD::CppTypeName(FD::CPPTYPE_UINT32)); - EXPECT_EQ(absl::string_view("uint64"), FD::CppTypeName(FD::CPPTYPE_UINT64)); - EXPECT_EQ(absl::string_view("double"), FD::CppTypeName(FD::CPPTYPE_DOUBLE)); - EXPECT_EQ(absl::string_view("float"), FD::CppTypeName(FD::CPPTYPE_FLOAT)); - EXPECT_EQ(absl::string_view("bool"), FD::CppTypeName(FD::CPPTYPE_BOOL)); - EXPECT_EQ(absl::string_view("enum"), FD::CppTypeName(FD::CPPTYPE_ENUM)); - EXPECT_EQ(absl::string_view("string"), FD::CppTypeName(FD::CPPTYPE_STRING)); - EXPECT_EQ(absl::string_view("message"), FD::CppTypeName(FD::CPPTYPE_MESSAGE)); + EXPECT_EQ("ERROR", FD::CppTypeName(FD::CppType{})); + EXPECT_EQ("int32", FD::CppTypeName(FD::CPPTYPE_INT32)); + EXPECT_EQ("int64", FD::CppTypeName(FD::CPPTYPE_INT64)); + EXPECT_EQ("uint32", FD::CppTypeName(FD::CPPTYPE_UINT32)); + EXPECT_EQ("uint64", FD::CppTypeName(FD::CPPTYPE_UINT64)); + EXPECT_EQ("double", FD::CppTypeName(FD::CPPTYPE_DOUBLE)); + EXPECT_EQ("float", FD::CppTypeName(FD::CPPTYPE_FLOAT)); + EXPECT_EQ("bool", FD::CppTypeName(FD::CPPTYPE_BOOL)); + EXPECT_EQ("enum", FD::CppTypeName(FD::CPPTYPE_ENUM)); + EXPECT_EQ("string", FD::CppTypeName(FD::CPPTYPE_STRING)); + EXPECT_EQ("message", FD::CppTypeName(FD::CPPTYPE_MESSAGE)); + + EXPECT_DEATH( + (void)FD::CppTypeName(static_cast(FD::MAX_CPPTYPE + 1)), + "Invalid input value"); +} + +TEST_F(MiscTest, StaticTypeToCppType) { + typedef FieldDescriptor FD; // avoid ugly line wrapping + // + EXPECT_EQ(FD::CppType{}, FD::TypeToCppType(FD::Type{})); + EXPECT_EQ(FD::CPPTYPE_DOUBLE, FD::TypeToCppType(FD::TYPE_DOUBLE)); + EXPECT_EQ(FD::CPPTYPE_FLOAT, FD::TypeToCppType(FD::TYPE_FLOAT)); + EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_INT64)); + EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_UINT64)); + EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_INT32)); + EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_FIXED64)); + EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_FIXED32)); + EXPECT_EQ(FD::CPPTYPE_BOOL, FD::TypeToCppType(FD::TYPE_BOOL)); + EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_STRING)); + EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_GROUP)); + EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_MESSAGE)); + EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_BYTES)); + EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_UINT32)); + EXPECT_EQ(FD::CPPTYPE_ENUM, FD::TypeToCppType(FD::TYPE_ENUM)); + EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SFIXED32)); + EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SFIXED64)); + EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SINT32)); + EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SINT64)); + + EXPECT_DEATH((void)FD::TypeToCppType(static_cast(FD::MAX_TYPE + 1)), + "Invalid input value"); } TEST_F(MiscTest, MessageType) {